diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cae341c..f6c84c4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -141,7 +141,7 @@ + + + + + + + + + + @@ -163,13 +177,7 @@ - - @@ -187,14 +195,18 @@ + android:screenOrientation="portrait" /> + + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + android:screenOrientation="portrait" /> + + android:screenOrientation="portrait" /> - - - - - - - - + + + + + + + + - - - + + + stringIntegerHashMap = new HashMap<>(); - WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); - DisplayMetrics dm = new DisplayMetrics(); - wm.getDefaultDisplay().getRealMetrics(dm); - float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5) - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.TOP_DECORATION, (int) (density * 1));//top间距 - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 1));//底部间距 - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 20));//左间距 - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 20));//右间距 - recyclerView.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap)); - mAddAppAdapter = new AddAppAdapter(); - recyclerView.setAdapter(mAddAppAdapter); - } - - @Override - public void initData() { - ArrayList desktopIcons = AppManager.getInstance().getAllAppList(); - mAddAppAdapter.setDesktopIcons(desktopIcons); - Set appList = AppManager.getInstance().getAddPackages(); - mAddAppAdapter.setPackageSet(appList); - tv_appsize.setText(String.format(getString(R.string.app_size), desktopIcons.size())); - } -} diff --git a/app/src/main/java/com/uiuios/aios/activity/AddItemActivity.java b/app/src/main/java/com/uiuios/aios/activity/AddItemActivity.java index 03c1c2d..e653261 100644 --- a/app/src/main/java/com/uiuios/aios/activity/AddItemActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/AddItemActivity.java @@ -123,7 +123,7 @@ public class AddItemActivity extends BaseDataBindingActivity { mComponentName = mInfo.getActivity(); // Drawable icon = getFullResIcon(mAppWidgetProviderInfo.provider.getPackageName(), mAppWidgetProviderInfo.icon); // RemoteViews remoteViews = getPreview(mRequest); - mShortcutPkgInfo = new ShortcutPkgInfo(mId, mTitle, mPackageName, mComponentName, d); + mShortcutPkgInfo = new ShortcutPkgInfo(mId, mTitle, mPackageName, mComponentName); } } diff --git a/app/src/main/java/com/uiuios/aios/activity/NoticeActivity.java b/app/src/main/java/com/uiuios/aios/activity/NoticeActivity.java index 8552b0c..02087f3 100644 --- a/app/src/main/java/com/uiuios/aios/activity/NoticeActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/NoticeActivity.java @@ -81,6 +81,9 @@ public class NoticeActivity extends AppCompatActivity { mMediaPlayer.release(); mMediaPlayer = null; } + if (mVibrator != null) { + mVibrator.cancel(); + } } @Override diff --git a/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java b/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java index 0b0ffb3..600cfb5 100644 --- a/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/NoticeInfoActivity.java @@ -249,6 +249,9 @@ public class NoticeInfoActivity extends AppCompatActivity { mMediaPlayer.release(); mMediaPlayer = null; } + if (mVibrator != null) { + mVibrator.cancel(); + } } @Override diff --git a/app/src/main/java/com/uiuios/aios/activity/SelectNumberActivity.java b/app/src/main/java/com/uiuios/aios/activity/SelectNumberActivity.java new file mode 100644 index 0000000..ab2e1d6 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/SelectNumberActivity.java @@ -0,0 +1,56 @@ +package com.uiuios.aios.activity; + +import android.content.Context; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.uiuios.aios.R; +import com.uiuios.aios.base.mvp.BaseMvpActivity; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import butterknife.ButterKnife; + +public class SelectNumberActivity extends BaseMvpActivity { + private static final String TAG = SelectNumberActivity.class.getSimpleName(); + + private TelephonyManager mTelephonyManager; + private SubscriptionManager subscriptionManager; + private TelecomManager telecomManager; + + @Override + public int getLayoutId() { + return R.layout.activity_select_number; + } + + @Override + public void initView() { + ButterKnife.bind(this); + mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + subscriptionManager = (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); + } + + @Override + public void initData() { + List subscriptionInfos = subscriptionManager.getActiveSubscriptionInfoList(); + for (SubscriptionInfo subscriptionInfo : subscriptionInfos) { + Log.e(TAG, "initData: id = " + subscriptionInfo.getSubscriptionId()); +// Log.e(TAG, "initData: mCardString = " + subscriptionInfo.getCardString()); +// Log.e(TAG, "initData: phone = " + mTelephonyManager.getLine1Number(subscriptionInfo.getSubscriptionId())); + } + List phoneAccountHandleList = telecomManager.getCallCapablePhoneAccounts(); + Map phoneAccountHandleMap = new HashMap<>(); + for (PhoneAccountHandle phoneAccountHandle : phoneAccountHandleList) { + phoneAccountHandleMap.put(phoneAccountHandle.getId(), phoneAccountHandle); + } + + Log.e(TAG, "initData: end"); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java b/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java index 816921a..c044be0 100644 --- a/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/SplashActivity.java @@ -6,7 +6,7 @@ import android.os.Handler; import androidx.databinding.DataBindingUtil; import com.uiuios.aios.R; -import com.uiuios.aios.activity.main.MainActivity; +import com.uiuios.aios.activity.main.OldMainActivity; import com.uiuios.aios.activity.main.PhoneMainActivity; import com.uiuios.aios.base.BaseDataBindingActivity; import com.uiuios.aios.utils.Utils; @@ -28,7 +28,7 @@ public class SplashActivity extends BaseDataBindingActivity { @Override public void run() { if (Utils.isTablet(SplashActivity.this)) { - startActivity(new Intent(SplashActivity.this, MainActivity.class)); + startActivity(new Intent(SplashActivity.this, OldMainActivity.class)); } else { startActivity(new Intent(SplashActivity.this, PhoneMainActivity.class)); } diff --git a/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconActivity.java b/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconActivity.java new file mode 100644 index 0000000..df6dcce --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconActivity.java @@ -0,0 +1,81 @@ +package com.uiuios.aios.activity.addicon; + +import android.content.Context; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.WindowManager; + +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.uiuios.aios.R; +import com.uiuios.aios.adapter.AddAppAdapter; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; +import com.uiuios.aios.bean.DesktopIcon; +import com.uiuios.aios.databinding.ActivityAddIconBinding; +import com.uiuios.aios.view.RecyclerViewSpacesItemDecoration; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Set; + +public class AddIconActivity extends BaseMvvmActivity { + + private AddAppAdapter mAddAppAdapter; + + @Override + protected int getLayoutId() { + return R.layout.activity_add_icon; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + public void initView() { + mViewDataBinding.recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); + HashMap stringIntegerHashMap = new HashMap<>(); + WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics dm = new DisplayMetrics(); + wm.getDefaultDisplay().getRealMetrics(dm); + float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5) + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.TOP_DECORATION, (int) (density * 1));//top间距 + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 1));//底部间距 + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 20));//左间距 + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 20));//右间距 + mViewDataBinding.recyclerView.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap)); + mAddAppAdapter = new AddAppAdapter(); + mViewDataBinding.recyclerView.setAdapter(mAddAppAdapter); + } + + @Override + public void initData() { + mViewModel.getDesktopIconData().observe(this, new Observer>() { + @Override + public void onChanged(ArrayList desktopIcons) { + mAddAppAdapter.setDesktopIcons(desktopIcons); + mViewDataBinding.tvAppsize.setText(String.format(getString(R.string.app_size), desktopIcons.size())); + } + }); + mViewModel.getPkgSet().observe(this, new Observer>() { + @Override + public void onChanged(Set strings) { + mAddAppAdapter.setPackageSet(strings); + } + }); + + mViewModel.getAppList(); + mViewModel.getAddPackages(); + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconViewModel.java b/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconViewModel.java new file mode 100644 index 0000000..b8d1203 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/addicon/AddIconViewModel.java @@ -0,0 +1,90 @@ +package com.uiuios.aios.activity.addicon; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.DesktopIcon; +import com.uiuios.aios.databinding.ActivityAddIconBinding; +import com.uiuios.aios.manager.AppManager; + +import java.util.ArrayList; +import java.util.Set; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import io.reactivex.rxjava3.core.ObservableOnSubscribe; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class AddIconViewModel extends BaseViewModel { + private static final String TAG = AddIconViewModel.class.getSimpleName(); + + + @Override + public ActivityAddIconBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mDesktopIconData = new MutableLiveData<>(); + + public MutableLiveData> getDesktopIconData() { + return mDesktopIconData; + } + + public void getAppList() { + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + emitter.onNext(AppManager.getInstance().getAllAppList()); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAppList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull ArrayList desktopIcons) { + Log.e("getAppList", "onNext: " + desktopIcons.size()); + mDesktopIconData.postValue(desktopIcons); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAppList", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAppList", "onComplete: "); + } + }); + } + + private MutableLiveData> mPkgSet = new MutableLiveData<>(); + + public MutableLiveData> getPkgSet() { + return mPkgSet; + } + + public void getAddPackages() { + Set appList = AppManager.getInstance().getAddPackages(); + mPkgSet.setValue(appList); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java b/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java index da90133..1dffef6 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/AddContactActivity.java @@ -80,7 +80,6 @@ public class AddContactActivity extends BaseDataBindingActivity { @Override public void initView() { ButterKnife.bind(this); - } @Override diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java index a3bcde2..5dd23a9 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactActivity.java @@ -3,102 +3,85 @@ package com.uiuios.aios.activity.contact; import android.content.Intent; import android.content.res.Configuration; import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import androidx.databinding.DataBindingUtil; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import com.uiuios.aios.R; -import com.uiuios.aios.adapter.ContactAdapter; -import com.uiuios.aios.base.BaseDataBindingActivity; +import com.uiuios.aios.adapter.OldContactAdapter; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.databinding.ActivityContactBinding; import java.util.List; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; +public class ContactActivity extends BaseMvvmActivity { -public class ContactActivity extends BaseDataBindingActivity implements ContactContact.ContactView { - @BindView(R.id.rv_contact) - RecyclerView rv_contact; - @BindView(R.id.tv_people) - TextView tv_people; - @BindView(R.id.iv_back) - ImageView iv_back; - @BindView(R.id.tv_add) - TextView tv_add; - @OnClick({R.id.iv_back}) - public void onClick(View view) { - switch (view.getId()) { - case R.id.iv_back: - finish(); - break; - default: - } + private OldContactAdapter mOldContactAdapter; + + @Override + protected int getLayoutId() { + return R.layout.activity_contact; } - private ContactPresenter mContactPresenter; - private ContactAdapter mContactAdapter; - @Override protected void initDataBinding() { - DataBindingUtil.setContentView(this, R.layout.activity_contact); + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); } @Override public void initView() { - ButterKnife.bind(this); - mContactPresenter = new ContactPresenter(this); - mContactPresenter.attachView(this); - mContactPresenter.setLifecycle(getLifecycleSubject()); - mContactAdapter = new ContactAdapter(); + mOldContactAdapter = new OldContactAdapter(); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - rv_contact.setLayoutManager(new GridLayoutManager(this, 3)); + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(this, 3)); } else { - rv_contact.setLayoutManager(new GridLayoutManager(this, 2)); + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(this, 2)); } - rv_contact.setAdapter(mContactAdapter); - tv_add.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(ContactActivity.this, AddContactActivity.class); - startActivity(intent); - } - }); + mViewDataBinding.rvContact.setAdapter(mOldContactAdapter); } @Override public void initData() { - + mViewModel.getContactList().observe(this, new Observer>() { + @Override + public void onChanged(List contacts) { + if (contacts == null || contacts.size() == 0) { + mViewDataBinding.tvPeople.setText("暂无数据"); + } else { + mViewDataBinding.tvPeople.setText(contacts.size() + "人"); + } + Contact contact = new Contact(); + contact.setName("拨号"); + contact.setMobile(OldContactAdapter.DIALER_PACKAGE); + contacts.add(0, contact); + mOldContactAdapter.setContactList(contacts); + } + }); + mViewModel.getContact(); } @Override protected void onResume() { super.onResume(); - mContactPresenter.getContact(); } @Override protected void onDestroy() { super.onDestroy(); - mContactPresenter.detachView(); } - @Override - public void setContact(List contactList) { - if (contactList == null || contactList.size() == 0) { - tv_people.setText("暂无数据"); - } else { - tv_people.setText(contactList.size() + "人"); + public class BtnClick { + public void exit(View view) { + finish(); + } + + public void toAdd(View view){ + Intent intent = new Intent(ContactActivity.this, AddContactActivity.class); + startActivity(intent); } - Contact contact = new Contact(); - contact.setName("拨号"); - contact.setMobile(ContactAdapter.DIALER_PACKAGE); - contactList.add(0, contact); - mContactAdapter.setContactList(contactList); } } diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java deleted file mode 100644 index 6e74a17..0000000 --- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactContact.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.uiuios.aios.activity.contact; - -import com.uiuios.aios.base.mvp.BasePresenter; -import com.uiuios.aios.base.mvp.BaseView; -import com.uiuios.aios.bean.Contact; - -import java.util.List; - -public class ContactContact { - public interface Presenter extends BasePresenter { - void getContact(); - } - - public interface ContactView extends BaseView { - void setContact(List contactList); - } -} diff --git a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java b/app/src/main/java/com/uiuios/aios/activity/contact/ContactViewModel.java similarity index 71% rename from app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java rename to app/src/main/java/com/uiuios/aios/activity/contact/ContactViewModel.java index 614aba3..eb3f79d 100644 --- a/app/src/main/java/com/uiuios/aios/activity/contact/ContactPresenter.java +++ b/app/src/main/java/com/uiuios/aios/activity/contact/ContactViewModel.java @@ -1,16 +1,19 @@ package com.uiuios.aios.activity.contact; -import android.content.Context; import android.util.Log; +import androidx.lifecycle.MutableLiveData; + import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.Contact; import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.ActivityContactBinding; import com.uiuios.aios.gson.GsonUtils; import com.uiuios.aios.network.NetInterfaceManager; import com.uiuios.aios.network.UrlAddress; @@ -22,42 +25,30 @@ import java.util.List; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; -public class ContactPresenter implements ContactContact.Presenter { - private Context mContext; - private ContactContact.ContactView mView; +public class ContactViewModel extends BaseViewModel { private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); - private BehaviorSubject lifecycle; - - void setLifecycle(BehaviorSubject lifecycle) { - this.lifecycle = lifecycle; - } - - public BehaviorSubject getLifecycle() { - return lifecycle; - } - - ContactPresenter(Context context) { - this.mContext = context; + @Override + public ActivityContactBinding getVDBinding() { + return binding; } @Override - public void attachView(@NonNull ContactContact.ContactView view) { - this.mView = view; + public void onDestroy() { + } - @Override - public void detachView() { - this.mView = null; + private MutableLiveData> mContactList = new MutableLiveData<>(); + + public MutableLiveData> getContactList() { + return mContactList; } - @Override public void getContact() { NetInterfaceManager.getInstance() .getContactListObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -69,10 +60,10 @@ public class ContactPresenter implements ContactContact.Presenter { Log.e("getContactList", "onNext: " + listBaseResponse); if (listBaseResponse.code == 200) { mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(listBaseResponse.data)); - mView.setContact(listBaseResponse.data); + mContactList.setValue(listBaseResponse.data); } else { mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); - mView.setContact(new ArrayList<>()); + mContactList.setValue(new ArrayList<>()); } } @@ -85,9 +76,9 @@ public class ContactPresenter implements ContactContact.Presenter { }.getType(); List contacts = gson.fromJson(jsonString, type); if (contacts == null) { - mView.setContact(new ArrayList<>()); + mContactList.setValue(new ArrayList<>()); }else { - mView.setContact(contacts); + mContactList.setValue(contacts); } onComplete(); } @@ -98,4 +89,5 @@ public class ContactPresenter implements ContactContact.Presenter { } }); } + } diff --git a/app/src/main/java/com/uiuios/aios/activity/DailyAppActivity.java b/app/src/main/java/com/uiuios/aios/activity/dailyapp/DailyAppActivity.java similarity index 98% rename from app/src/main/java/com/uiuios/aios/activity/DailyAppActivity.java rename to app/src/main/java/com/uiuios/aios/activity/dailyapp/DailyAppActivity.java index 49fe89e..b4ac196 100644 --- a/app/src/main/java/com/uiuios/aios/activity/DailyAppActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/dailyapp/DailyAppActivity.java @@ -1,4 +1,4 @@ -package com.uiuios.aios.activity; +package com.uiuios.aios.activity.dailyapp; import android.content.res.Configuration; import android.view.View; diff --git a/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java b/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java index 0c37220..b8e6473 100644 --- a/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/location/LocationAcivity.java @@ -168,8 +168,8 @@ public class LocationAcivity extends BaseDataBindingActivity implements Location float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5) stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.TOP_DECORATION, (int) (density * 4));//top间距 stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 4));//底部间距 - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 30));//左间距 - stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 30));//右间距 + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 4));//左间距 + stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 4));//右间距 rv_city.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap)); mCityAdapter = new CityAdapter(); mCityAdapter.setCityList(popularCities); diff --git a/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java deleted file mode 100644 index f6acd3d..0000000 --- a/app/src/main/java/com/uiuios/aios/activity/main/BaseMainActivity.java +++ /dev/null @@ -1,692 +0,0 @@ -package com.uiuios.aios.activity.main; - -import android.content.ActivityNotFoundException; -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.content.pm.PackageManager; -import android.content.pm.ShortcutManager; -import android.content.res.Configuration; -import android.graphics.Color; -import android.os.Build; -import android.os.Bundle; -import android.os.IBinder; -import android.os.RemoteException; -import android.provider.Settings; -import android.text.TextUtils; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; -import androidx.viewpager.widget.ViewPager; - -import com.alarmclock.uiui.IAlarmAidlInterface; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.hjq.permissions.OnPermissionCallback; -import com.hjq.permissions.Permission; -import com.hjq.permissions.XXPermissions; -import com.hjq.toast.Toaster; -import com.uiuios.aios.BuildConfig; -import com.uiuios.aios.R; -import com.uiuios.aios.base.BaseDataBindingActivity; -import com.uiuios.aios.base.BaseFragmentPagerAdapter; -import com.uiuios.aios.bean.AlarmItem; -import com.uiuios.aios.bean.DesktopIcon; -import com.uiuios.aios.config.CommonConfig; -import com.uiuios.aios.fragment.AppListFragment; -import com.uiuios.aios.fragment.ControlFragment; -import com.uiuios.aios.fragment.home.HomeFragment; -import com.uiuios.aios.fragment.second.SecondFragment; -import com.uiuios.aios.manager.AmapManager; -import com.uiuios.aios.manager.RemoteManager; -import com.uiuios.aios.service.NotificationService; -import com.uiuios.aios.utils.ApkUtils; -import com.uiuios.aios.utils.AppUsedTimeUtils; - -import com.uiuios.aios.view.ScaleCircleNavigator; - -import net.lucode.hackware.magicindicator.MagicIndicator; -import net.lucode.hackware.magicindicator.ViewPagerHelper; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -public abstract class BaseMainActivity extends BaseDataBindingActivity implements MainContact.MainView, RemoteManager.ConnectedListener { - private static final String TAG = BaseMainActivity.class.getSimpleName(); - - private MainPresenter mMainPresenter; - - @BindView(R.id.viewPager) - ViewPager mViewPager; - @BindView(R.id.magicIndicator) - MagicIndicator mMagicIndicator; - - private FragmentManager mFragmentManager; - private FragmentTransaction mFragmentTransaction; - - private ScaleCircleNavigator scaleCircleNavigator; - private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter; - - private List mFragments; - private ControlFragment mControlFragment; - private HomeFragment mHomeFragment; - // private CustomFragment mCustomFragment; - private SecondFragment mSecondFragment; - - private boolean is_twoscreen = false; - private int appListIndex = 3; - private int defaultCurrent = 2; - - @Override - public void onConnected() { - setDefaultDesktop(); - } - - @Override - public void initView() { - getLocationPermission(); - - ButterKnife.bind(this); - toggleNotificationListenerService(this); - mMainPresenter = new MainPresenter(this); - mMainPresenter.attachView(this); - mMainPresenter.setLifecycle(getLifecycleSubject()); - - if (BuildConfig.DEBUG) { -// SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 -// SystemClock.setCurrentTimeMillis(1662210000000L);//09-03 - } - -// if (!isNotificationListenersEnabled()) { -// Toaster.show("请授予\"" + getString(R.string.app_name) + "\"使用通知权"); -// gotoNotificationAccessSetting(BaseMainActivity.this); -// } - - mFragmentManager = getSupportFragmentManager(); - mFragmentTransaction = mFragmentManager.beginTransaction(); - mFragments = new ArrayList<>(); - mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments); -// fragmentTransaction.add(R.id.viewPager, appListFragment); -// fragmentTransaction.commit(); - mControlFragment = new ControlFragment(); - mFragments.add(mControlFragment); -// is_twoscreen = Settings.Global.getInt(getContentResolver(), "is_twoscreen", 1) == 1; -// if (is_twoscreen) { -// appListIndex = 2; -// defaultCurrent = 1; - mSecondFragment = new SecondFragment(); - mFragments.add(mSecondFragment); -// } -// mCustomFragment = new CustomFragment(); -// mFragments.add(mCustomFragment); - - mHomeFragment = new HomeFragment(); - mFragments.add(mHomeFragment); - - mMainPresenter.getSystemSettings(); -// mMainPresenter.getAdminSnSetting(); - ArrayList desktopIcons = ApkUtils.queryFilterAppInfo(this); - int x = 0; - for (int i = 0; i <= desktopIcons.size(); i++) { - if (i != 0 && i % APP_LIST_SIZE == 0) { - AppListFragment appListFragment = new AppListFragment(); - appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); - mFragments.add(appListFragment); - x = i; - } else if (i == desktopIcons.size()) { - AppListFragment appListFragment = new AppListFragment(); - mFragments.add(appListFragment); - appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); - } - } - - scaleCircleNavigator = new ScaleCircleNavigator(this); - scaleCircleNavigator.setCircleCount(mFragments.size()); - scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY); - scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY); - scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() { - @Override - public void onClick(int index) { - - } - }); - - mViewPager.setAdapter(mBaseFragmentPagerAdapter); - mViewPager.setOffscreenPageLimit(3); - mMagicIndicator.setNavigator(scaleCircleNavigator); - ViewPagerHelper.bind(mMagicIndicator, mViewPager); - if (mFragments.size() > 1) { - mViewPager.setCurrentItem(defaultCurrent); - } - - View decorView = getWindow().getDecorView(); - decorView.setOnSystemUiVisibilityChangeListener(mOnSystemUiVisibilityChangeListener); - - // 隐藏导航栏 - hideNavigationBar(); - ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); - Log.e(TAG, "isRequestPinShortcutSupported: " + shortcutManager.isRequestPinShortcutSupported()); - } - - private View.OnSystemUiVisibilityChangeListener mOnSystemUiVisibilityChangeListener = - new View.OnSystemUiVisibilityChangeListener() { - @Override - public void onSystemUiVisibilityChange(int visibility) { - if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { - // 导航栏显示中,重新隐藏导航栏 - hideNavigationBar(); - } - } - }; - - // 隐藏导航栏 - private void hideNavigationBar() { - View decorView = getWindow().getDecorView(); - int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - decorView.setSystemUiVisibility(uiOptions); - } - - - @Override - public void initData() { - registReceiver(); - - mAlarmServiceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - Log.e(TAG, "onServiceConnected: "); - mIAlarmAidlInterface = IAlarmAidlInterface.Stub.asInterface(service); - getAlarmData(); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - Log.e(TAG, "onServiceDisconnected: "); - mIAlarmAidlInterface = null; - } - }; - bindAlarmService(); - RemoteManager.setListener(this); - } - - private ServiceConnection mAlarmServiceConnection; - private IAlarmAidlInterface mIAlarmAidlInterface; - - private void bindAlarmService() { - if (mIAlarmAidlInterface == null) { - //这是连接aidl服务的代码 - Intent intent = new Intent(); - intent.setAction("com.alarmclock.uiui.IAlarmAidlInterface"); - intent.setPackage("com.alarmclock.uiui"); - intent.setComponent(new ComponentName("com.alarmclock.uiui", "com.alarmclock.uiui.AIDLAlarmService")); - bindService(intent, mAlarmServiceConnection, Context.BIND_AUTO_CREATE); - } else { - - } - } - - public static void toggleNotificationListenerService(Context context) { - Log.e(TAG, "toggleNotificationListenerService"); - PackageManager pm = context.getPackageManager(); - pm.setComponentEnabledSetting(new ComponentName(context, NotificationService.class), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); - - pm.setComponentEnabledSetting(new ComponentName(context, NotificationService.class), - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - } - - private void getAlarmData() { - if (mIAlarmAidlInterface == null) { - bindAlarmService(); - return; - } - try { - String json = mIAlarmAidlInterface.getAlarm(); - Log.e(TAG, "onServiceConnected: " + json); - if ("暂无闹钟".equalsIgnoreCase(json) || TextUtils.isEmpty(json)) { -// mCustomFragment.setAlarmItem(null); - return; - } - Type type = new TypeToken>() { - }.getType(); - List alarmItem = new Gson().fromJson(json, type); -// mCustomFragment.setAlarmItem(alarmItem); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - private final static int APP_LIST_SIZE = 3 * 4; - - private void addData() { - Log.e(TAG, "addData: "); - List fragmentList = new ArrayList<>(); - ArrayList applicationInfoList = ApkUtils.queryFilterAppInfo(this); - int x = 0; - for (int i = 0; i <= applicationInfoList.size(); i++) { - if (i != 0 && i % APP_LIST_SIZE == 0) { - AppListFragment appListFragment = new AppListFragment(); - appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); - fragmentList.add(appListFragment); - x = i; - } else if (i == applicationInfoList.size()) { - AppListFragment appListFragment = new AppListFragment(); - fragmentList.add(appListFragment); - appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); - } - } - //从第三个开始改 - for (int i = 0; i < fragmentList.size(); i++) { - if (i + appListIndex < mFragments.size()) { - mBaseFragmentPagerAdapter.replaceFragment(i + appListIndex, fragmentList.get(i)); -// mFragments.remove(i + 2); -// mFragments.add(i + 2, fragmentList.get(i)); - } else { -// mFragments.add(fragmentList.get(i)); -// mBaseFragmentPagerAdapter.getFragments(); - mBaseFragmentPagerAdapter.addFragment(fragmentList.get(i)); - } - } - for (int i = mFragments.size(); i > fragmentList.size() + appListIndex; i--) { - mFragments.remove(i - 1); - } - scaleCircleNavigator.setCircleCount(mFragments.size()); - scaleCircleNavigator.notifyDataSetChanged(); - mBaseFragmentPagerAdapter.notifyItemChanged(); - } - - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { - return false; - } - return super.onKeyDown(keyCode, event); - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - Log.e(TAG, "onNewIntent: " + intent.getAction()); - String action = intent.getAction(); - if (TextUtils.isEmpty(action)) { - return; - } - switch (action) { - default: - break; - case Intent.ACTION_MAIN: - mViewPager.setCurrentItem(defaultCurrent); - break; - } - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - - @Override - protected void onStart() { - super.onStart(); - AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); - AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); - getAlarmData(); - } - - @Override - protected void onResume() { - super.onResume(); - Log.e(TAG, "onResume: "); - - getPermission(); - } - - public static final String Launcher3 = "com.android.launcher3"; - public static final String Launcher3Class = "com.android.launcher3.Launcher"; - public static final String Launcher3QuickstepClass = "com.android.launcher3.uioverrides.QuickstepLauncher"; - - private void setDefaultDesktop() { - int is_activation = Settings.Global.getInt(getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0); - Log.e(TAG, "onResume: is_activation = " + is_activation); - if (is_activation == 1) { - RemoteManager.getInstance().setDefaultDesktop(BuildConfig.APPLICATION_ID, this.getClass().getName()); - } else { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { - RemoteManager.getInstance().setDefaultDesktop(Launcher3, Launcher3QuickstepClass); - } else { - RemoteManager.getInstance().setDefaultDesktop(Launcher3, Launcher3Class); - } - } - } - - - private String[] permission = new String[]{ - Permission.CALL_PHONE, -// Permission.REQUEST_INSTALL_PACKAGES, - Permission.WRITE_EXTERNAL_STORAGE, - Permission.READ_PHONE_STATE, - Permission.WRITE_SETTINGS, - Permission.READ_CALL_LOG, - Permission.WRITE_CALL_LOG, - Permission.READ_CONTACTS, - Permission.WRITE_CONTACTS, - }; - - private void getPermission() { - XXPermissions.with(this) - // 申请单个权限 - .permission(permission) - // 申请多个权限 -// .permission(Permission.Group.STORAGE) - // 设置权限请求拦截器(局部设置) - //.interceptor(new PermissionInterceptor()) - // 设置不触发错误检测机制(局部设置) - //.unchecked() - .request(new OnPermissionCallback() { - @Override - public void onGranted(@NonNull List permissions, boolean allGranted) { - Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted); - if (!allGranted) { - Toaster.show("获取部分权限成功,但部分权限未正常授予"); - return; - } - Log.e(TAG, "onGranted: 获取权限成功"); - addData(); - } - - @Override - public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { - Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain); - if (doNotAskAgain) { - Toaster.show("被永久拒绝授权,请手动授予权限"); - // 如果是被永久拒绝就跳转到应用权限系统设置页面 - XXPermissions.startPermissionActivity(BaseMainActivity.this, permissions); - } else { - Log.e(TAG, "onGranted: 获取权限失败"); - } - } - }); - } - - private String[] mLocationPermission = new String[]{ - Permission.ACCESS_COARSE_LOCATION, - Permission.ACCESS_FINE_LOCATION, - Permission.ACCESS_BACKGROUND_LOCATION, - }; - - private void getLocationPermission() { - XXPermissions.with(this) - // 申请单个权限 - .permission(mLocationPermission) - // 申请多个权限 -// .permission(Permission.Group.STORAGE) - // 设置权限请求拦截器(局部设置) - //.interceptor(new PermissionInterceptor()) - // 设置不触发错误检测机制(局部设置) - //.unchecked() - .request(new OnPermissionCallback() { - @Override - public void onGranted(@NonNull List permissions, boolean allGranted) { - Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted); - if (!allGranted) { - Toaster.show("获取部分权限成功,但部分权限未正常授予"); - return; - } - Log.e(TAG, "onGranted: 获取定位权限成功"); - } - - @Override - public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { - Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain); -// if (doNotAskAgain) { -// Toaster.show("被永久拒绝授权,请手动授予定位权限"); -// // 如果是被永久拒绝就跳转到应用权限系统设置页面 -// XXPermissions.startPermissionActivity(BaseMainActivity.this, permissions); -// } else { -// Log.e(TAG, "onGranted: 获取定位权限失败"); -// } - } - }); - } - - private static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners"; - - private boolean isNotificationListenersEnabled() { - String pkgName = getPackageName(); - final String flat = Settings.Secure.getString(getContentResolver(), ENABLED_NOTIFICATION_LISTENERS); - if (!TextUtils.isEmpty(flat)) { - final String[] names = flat.split(":"); - for (int i = 0; i < names.length; i++) { - final ComponentName cn = ComponentName.unflattenFromString(names[i]); - if (cn != null) { - if (TextUtils.equals(pkgName, cn.getPackageName())) { - return true; - } - } - } - } - return false; - } - - public static boolean gotoNotificationAccessSetting(Context context) { - try { - Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - return true; - - } catch (ActivityNotFoundException e) {//普通情况下找不到的时候需要再特殊处理找一次 - try { - Intent intent = new Intent(); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$NotificationAccessSettingsActivity"); - intent.setComponent(cn); - intent.putExtra(":settings:show_fragment", "NotificationAccessSettings"); - context.startActivity(intent); - return true; - } catch (Exception e1) { - e1.printStackTrace(); - } - Toaster.show("对不起,您的手机暂不支持"); - e.printStackTrace(); - return false; - } - } - - - @Override - protected void onRestart() { - super.onRestart(); -// mMainPresenter.sendAPPUsage(); -// mMainPresenter.sendRunningInfo(); - } - - @Override - protected void onPause() { - super.onPause(); - } - - @Override - protected void onStop() { - super.onStop(); - AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - mMainPresenter.detachView(); - unregisterAllReceiver(); - RemoteManager.removeListener(this); - } - - @Override - protected void onSaveInstanceState(@NonNull Bundle outState) { -// super.onSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { -// super.onRestoreInstanceState(savedInstanceState); - } - - private void registReceiver() { - registNewAppReceiver(); - registerSOSNumberReceiver(); - registerUpdateDesktopReceiver(); - registmUpdateAddressReceiver(); - } - - private void unregisterAllReceiver() { - if (mNewAppReceiver != null) { - unregisterReceiver(mNewAppReceiver); - } - if (mSOSNumberReceiver != null) { - unregisterReceiver(mSOSNumberReceiver); - } - if (mUpdateDesktopReceiver != null) { - unregisterReceiver(mUpdateDesktopReceiver); - } - if (mUpdateAddressReceiver != null) { - unregisterReceiver(mUpdateAddressReceiver); - } - } - - private void registNewAppReceiver() { - mNewAppReceiver = new NewAppReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(Intent.ACTION_PACKAGE_ADDED); - filter.addAction(Intent.ACTION_PACKAGE_CHANGED); - filter.addAction(Intent.ACTION_PACKAGE_REPLACED); - filter.addAction(Intent.ACTION_PACKAGE_REMOVED); - filter.addDataScheme("package"); - registerReceiver(mNewAppReceiver, filter); - } - - private NewAppReceiver mNewAppReceiver; - - class NewAppReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - Log.e(TAG, "onReceive: " + action); - if (Intent.ACTION_PACKAGE_ADDED.equals(action) - || Intent.ACTION_PACKAGE_REMOVED.equals(action) - || Intent.ACTION_PACKAGE_CHANGED.equals(action)) { - addData(); - } - } - } - - private SOSNumberReceiver mSOSNumberReceiver; - - private void registerSOSNumberReceiver() { - if (mSOSNumberReceiver == null) { - mSOSNumberReceiver = new SOSNumberReceiver(); - } - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction("setting_sos"); - registerReceiver(mSOSNumberReceiver, filter); - } - - class SOSNumberReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - Log.e(TAG, "onReceive: " + intent.getAction()); - String setting_sos = intent.getStringExtra("setting_sos"); - if (TextUtils.isEmpty(setting_sos)) return; -// mCustomFragment.setSosNumber(); - } - } - - public static final String ACTION_PACKAGE_HIDE = "com.uiui.aios.ACTION_PACKAGE_HIDE"; - - private UpdateDesktopReceiver mUpdateDesktopReceiver; - - private void registerUpdateDesktopReceiver() { - if (mUpdateDesktopReceiver == null) { - mUpdateDesktopReceiver = new UpdateDesktopReceiver(); - } - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction("UPDATE_DESKTOP_ICON"); - filter.addAction(ACTION_PACKAGE_HIDE); - registerReceiver(mUpdateDesktopReceiver, filter); - } - - class UpdateDesktopReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - Log.e(TAG, "onReceive: " + intent.getAction()); - addData(); - } - } - - private UpdateAddressReceiver mUpdateAddressReceiver; - - private void registmUpdateAddressReceiver() { - mUpdateAddressReceiver = new UpdateAddressReceiver(); - IntentFilter filter = new IntentFilter(); - filter.addAction(CommonConfig.UIUIAIOS_UPDATE_ADDRESS_ACTION); - registerReceiver(mUpdateAddressReceiver, filter); - } - - class UpdateAddressReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (CommonConfig.UIUIAIOS_UPDATE_ADDRESS_ACTION.equals(action)) { - AmapManager.getInstance().startLocation(); - } - } - } - - @Override - public void setSystemSettings() { -// mMainPresenter.getDesktopLayout(); - } - - @Override - public void getDesktopLayoutFinish() { - - } - - @Override - public void updateDesktopLayoutFinish() { - - } - - @Override - public void sendAPPUsageFinish() { - - } - - @Override - public void sendRunningInfoFinish() { - - } - - @Override - public void setAdminSnSetting() { - - } -} - diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java index 6b34f8e..d3e7af1 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java @@ -1,33 +1,704 @@ package com.uiuios.aios.activity.main; +import android.content.ActivityNotFoundException; +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.content.pm.PackageManager; +import android.content.pm.ShortcutManager; +import android.content.res.Configuration; +import android.graphics.Color; +import android.os.Build; import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; +import android.view.KeyEvent; +import android.view.View; -import androidx.annotation.Nullable; -import androidx.databinding.DataBindingUtil; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.lifecycle.Observer; +import com.alarmclock.uiui.IAlarmAidlInterface; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; +import com.hjq.toast.Toaster; +import com.uiuios.aios.BuildConfig; import com.uiuios.aios.R; +import com.uiuios.aios.activity.EmergencyActivity; +import com.uiuios.aios.activity.phone.PhoneActivity; +import com.uiuios.aios.base.BaseFragmentPagerAdapter; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; +import com.uiuios.aios.bean.AlarmItem; +import com.uiuios.aios.bean.DesktopIcon; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.PhoneActivityMainBinding; +import com.uiuios.aios.fragment.app.AppListFragment; +import com.uiuios.aios.fragment.control.ControlFragment; +import com.uiuios.aios.fragment.contact.ContactFragment; +import com.uiuios.aios.fragment.home.HomeFragment; +import com.uiuios.aios.manager.AmapManager; +import com.uiuios.aios.manager.RemoteManager; +import com.uiuios.aios.service.NotificationService; +import com.uiuios.aios.utils.ApkUtils; +import com.uiuios.aios.utils.AppUsedTimeUtils; +import com.uiuios.aios.view.ScaleCircleNavigator; -public class MainActivity extends BaseMainActivity { +import net.lucode.hackware.magicindicator.ViewPagerHelper; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class MainActivity extends BaseMvvmActivity implements RemoteManager.ConnectedListener { private static final String TAG = MainActivity.class.getSimpleName(); + private FragmentManager mFragmentManager; + private FragmentTransaction mFragmentTransaction; + + private ScaleCircleNavigator scaleCircleNavigator; + private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter; + + private List mFragments; + private ControlFragment mControlFragment; + private HomeFragment mHomeFragment; + // private CustomFragment mCustomFragment; + private ContactFragment mSecondFragment; + + private boolean is_twoscreen = false; + private int appListIndex = 3; + private int defaultCurrent = 2; + @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Log.e(TAG, "onCreate: "); + public void onConnected() { + setDefaultDesktop(); + } + + @Override + public boolean setNightMode() { + return true; + } + + @Override + protected int getLayoutId() { + return R.layout.phone_activity_main; } @Override protected void initDataBinding() { - DataBindingUtil.setContentView(this, R.layout.activity_main); + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + + @Override + public void initView() { + getLocationPermission(); + + toggleNotificationListenerService(this); + + if (BuildConfig.DEBUG) { +// SystemClock.setCurrentTimeMillis(1662123600000L);//09-02 +// SystemClock.setCurrentTimeMillis(1662210000000L);//09-03 + } + +// if (!isNotificationListenersEnabled()) { +// Toaster.show("请授予\"" + getString(R.string.app_name) + "\"使用通知权"); +// gotoNotificationAccessSetting(MainActivity.this); +// } + + mFragmentManager = getSupportFragmentManager(); + mFragmentTransaction = mFragmentManager.beginTransaction(); + mFragments = new ArrayList<>(); + mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments); +// fragmentTransaction.add(R.id.viewPager, appListFragment); +// fragmentTransaction.commit(); + mControlFragment = new ControlFragment(); + mFragments.add(mControlFragment); +// is_twoscreen = Settings.Global.getInt(getContentResolver(), "is_twoscreen", 1) == 1; +// if (is_twoscreen) { +// appListIndex = 2; +// defaultCurrent = 1; + mSecondFragment = new ContactFragment(); + mFragments.add(mSecondFragment); +// } +// mCustomFragment = new CustomFragment(); +// mFragments.add(mCustomFragment); + + mHomeFragment = new HomeFragment(); + mFragments.add(mHomeFragment); + + ArrayList desktopIcons = ApkUtils.queryFilterAppInfo(this); + int x = 0; + for (int i = 0; i <= desktopIcons.size(); i++) { + if (i != 0 && i % APP_LIST_SIZE == 0) { + AppListFragment appListFragment = new AppListFragment(); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + mFragments.add(appListFragment); + x = i; + } else if (i == desktopIcons.size()) { + AppListFragment appListFragment = new AppListFragment(); + mFragments.add(appListFragment); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + } + } + + scaleCircleNavigator = new ScaleCircleNavigator(this); + scaleCircleNavigator.setCircleCount(mFragments.size()); + scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY); + scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY); + scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() { + @Override + public void onClick(int index) { + + } + }); + + mViewDataBinding.viewPager.setAdapter(mBaseFragmentPagerAdapter); + mViewDataBinding.viewPager.setOffscreenPageLimit(3); + mViewDataBinding.magicIndicator.setNavigator(scaleCircleNavigator); + ViewPagerHelper.bind(mViewDataBinding.magicIndicator, mViewDataBinding.viewPager); + if (mFragments.size() > 1) { + mViewDataBinding.viewPager.setCurrentItem(defaultCurrent); + } + + View decorView = getWindow().getDecorView(); + decorView.setOnSystemUiVisibilityChangeListener(mOnSystemUiVisibilityChangeListener); + + // 隐藏导航栏 + hideNavigationBar(); + ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); + Log.e(TAG, "isRequestPinShortcutSupported: " + shortcutManager.isRequestPinShortcutSupported()); + } + + private View.OnSystemUiVisibilityChangeListener mOnSystemUiVisibilityChangeListener = + new View.OnSystemUiVisibilityChangeListener() { + @Override + public void onSystemUiVisibilityChange(int visibility) { + if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { + // 导航栏显示中,重新隐藏导航栏 + hideNavigationBar(); + } + } + }; + + // 隐藏导航栏 + private void hideNavigationBar() { + View decorView = getWindow().getDecorView(); + int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + decorView.setSystemUiVisibility(uiOptions); + } + + + @Override + public void initData() { + mViewModel.getDesktopIconData().observe(this, new Observer>() { + @Override + public void onChanged(ArrayList desktopIcons) { + int x = 0; + for (int i = 0; i <= desktopIcons.size(); i++) { + if (i != 0 && i % APP_LIST_SIZE == 0) { + AppListFragment appListFragment = new AppListFragment(); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + mFragments.add(appListFragment); + x = i; + } else if (i == desktopIcons.size()) { + AppListFragment appListFragment = new AppListFragment(); + mFragments.add(appListFragment); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + } + } + } + }); +// mViewModel.getAppList(); + + registReceiver(); + + mAlarmServiceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + Log.e(TAG, "onServiceConnected: "); + mIAlarmAidlInterface = IAlarmAidlInterface.Stub.asInterface(service); + getAlarmData(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + Log.e(TAG, "onServiceDisconnected: "); + mIAlarmAidlInterface = null; + } + }; + bindAlarmService(); + RemoteManager.setListener(this); + } + + private ServiceConnection mAlarmServiceConnection; + private IAlarmAidlInterface mIAlarmAidlInterface; + + private void bindAlarmService() { + if (mIAlarmAidlInterface == null) { + //这是连接aidl服务的代码 + Intent intent = new Intent(); + intent.setAction("com.alarmclock.uiui.IAlarmAidlInterface"); + intent.setPackage("com.alarmclock.uiui"); + intent.setComponent(new ComponentName("com.alarmclock.uiui", "com.alarmclock.uiui.AIDLAlarmService")); + bindService(intent, mAlarmServiceConnection, Context.BIND_AUTO_CREATE); + } else { + + } + } + + public static void toggleNotificationListenerService(Context context) { + Log.e(TAG, "toggleNotificationListenerService"); + PackageManager pm = context.getPackageManager(); + pm.setComponentEnabledSetting(new ComponentName(context, NotificationService.class), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + + pm.setComponentEnabledSetting(new ComponentName(context, NotificationService.class), + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + } + + private void getAlarmData() { + if (mIAlarmAidlInterface == null) { + bindAlarmService(); + return; + } + try { + String json = mIAlarmAidlInterface.getAlarm(); + Log.e(TAG, "onServiceConnected: " + json); + if ("暂无闹钟".equalsIgnoreCase(json) || TextUtils.isEmpty(json)) { +// mCustomFragment.setAlarmItem(null); + return; + } + Type type = new TypeToken>() { + }.getType(); + List alarmItem = new Gson().fromJson(json, type); +// mCustomFragment.setAlarmItem(alarmItem); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + private final static int APP_LIST_SIZE = 3 * 4; + + private void addData() { + Log.e(TAG, "addData: "); + List fragmentList = new ArrayList<>(); + ArrayList applicationInfoList = ApkUtils.queryFilterAppInfo(this); + int x = 0; + for (int i = 0; i <= applicationInfoList.size(); i++) { + if (i != 0 && i % APP_LIST_SIZE == 0) { + AppListFragment appListFragment = new AppListFragment(); + appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); + fragmentList.add(appListFragment); + x = i; + } else if (i == applicationInfoList.size()) { + AppListFragment appListFragment = new AppListFragment(); + fragmentList.add(appListFragment); + appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); + } + } + //从第三个开始改 + for (int i = 0; i < fragmentList.size(); i++) { + if (i + appListIndex < mFragments.size()) { + mBaseFragmentPagerAdapter.replaceFragment(i + appListIndex, fragmentList.get(i)); +// mFragments.remove(i + 2); +// mFragments.add(i + 2, fragmentList.get(i)); + } else { +// mFragments.add(fragmentList.get(i)); +// mBaseFragmentPagerAdapter.getFragments(); + mBaseFragmentPagerAdapter.addFragment(fragmentList.get(i)); + } + } + for (int i = mFragments.size(); i > fragmentList.size() + appListIndex; i--) { + mFragments.remove(i - 1); + } + scaleCircleNavigator.setCircleCount(mFragments.size()); + scaleCircleNavigator.notifyDataSetChanged(); + mBaseFragmentPagerAdapter.notifyItemChanged(); + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { + return false; + } + return super.onKeyDown(keyCode, event); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - Log.e(TAG, "onNewIntent: getAction = " + intent.getAction()); - Log.e(TAG, "onNewIntent: getCategories = " + intent.getCategories()); - Log.e(TAG, "onNewIntent: getFlags = " + intent.getFlags()); + Log.e(TAG, "onNewIntent: " + intent.getAction()); + String action = intent.getAction(); + if (TextUtils.isEmpty(action)) { + return; + } + switch (action) { + default: + break; + case Intent.ACTION_MAIN: + mViewDataBinding.viewPager.setCurrentItem(defaultCurrent); + break; + } + } + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + } + + @Override + protected void onStart() { + super.onStart(); + AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + getAlarmData(); + } + + @Override + protected void onResume() { + super.onResume(); + Log.e(TAG, "onResume: "); + + getPermission(); + } + + public static final String Launcher3 = "com.android.launcher3"; + public static final String Launcher3Class = "com.android.launcher3.Launcher"; + public static final String Launcher3QuickstepClass = "com.android.launcher3.uioverrides.QuickstepLauncher"; + + private void setDefaultDesktop() { + int is_activation = Settings.Global.getInt(getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0); + Log.e(TAG, "onResume: is_activation = " + is_activation); + if (is_activation == 1) { + RemoteManager.getInstance().setDefaultDesktop(BuildConfig.APPLICATION_ID, this.getClass().getName()); + } else { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { + RemoteManager.getInstance().setDefaultDesktop(Launcher3, Launcher3QuickstepClass); + } else { + RemoteManager.getInstance().setDefaultDesktop(Launcher3, Launcher3Class); + } + } + } + + + private String[] permission = new String[]{ + Permission.CALL_PHONE, +// Permission.REQUEST_INSTALL_PACKAGES, + Permission.WRITE_EXTERNAL_STORAGE, + Permission.READ_PHONE_STATE, + Permission.WRITE_SETTINGS, + Permission.READ_CALL_LOG, + Permission.WRITE_CALL_LOG, + Permission.READ_CONTACTS, + Permission.WRITE_CONTACTS, + }; + + private void getPermission() { + XXPermissions.with(this) + // 申请单个权限 + .permission(permission) + // 申请多个权限 +// .permission(Permission.Group.STORAGE) + // 设置权限请求拦截器(局部设置) + //.interceptor(new PermissionInterceptor()) + // 设置不触发错误检测机制(局部设置) + //.unchecked() + .request(new OnPermissionCallback() { + @Override + public void onGranted(@NonNull List permissions, boolean allGranted) { + Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted); + if (!allGranted) { + Toaster.show("获取部分权限成功,但部分权限未正常授予"); + return; + } + Log.e(TAG, "onGranted: 获取权限成功"); + addData(); + } + + @Override + public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { + Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain); + if (doNotAskAgain) { + Toaster.show("被永久拒绝授权,请手动授予权限"); + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(MainActivity.this, permissions); + } else { + Log.e(TAG, "onGranted: 获取权限失败"); + } + } + }); + } + + private String[] mLocationPermission = new String[]{ + Permission.ACCESS_COARSE_LOCATION, + Permission.ACCESS_FINE_LOCATION, + Permission.ACCESS_BACKGROUND_LOCATION, + }; + + private void getLocationPermission() { + XXPermissions.with(this) + // 申请单个权限 + .permission(mLocationPermission) + // 申请多个权限 +// .permission(Permission.Group.STORAGE) + // 设置权限请求拦截器(局部设置) + //.interceptor(new PermissionInterceptor()) + // 设置不触发错误检测机制(局部设置) + //.unchecked() + .request(new OnPermissionCallback() { + @Override + public void onGranted(@NonNull List permissions, boolean allGranted) { + Log.e(TAG, "onGranted: permissions = " + permissions + " allGranted = " + allGranted); + if (!allGranted) { + Toaster.show("获取部分权限成功,但部分权限未正常授予"); + return; + } + Log.e(TAG, "onGranted: 获取定位权限成功"); + } + + @Override + public void onDenied(@NonNull List permissions, boolean doNotAskAgain) { + Log.e(TAG, "onDenied: permissions = " + permissions + " doNotAskAgain = " + doNotAskAgain); +// if (doNotAskAgain) { +// Toaster.show("被永久拒绝授权,请手动授予定位权限"); +// // 如果是被永久拒绝就跳转到应用权限系统设置页面 +// XXPermissions.startPermissionActivity(MainActivity.this, permissions); +// } else { +// Log.e(TAG, "onGranted: 获取定位权限失败"); +// } + } + }); + } + + private static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners"; + + private boolean isNotificationListenersEnabled() { + String pkgName = getPackageName(); + final String flat = Settings.Secure.getString(getContentResolver(), ENABLED_NOTIFICATION_LISTENERS); + if (!TextUtils.isEmpty(flat)) { + final String[] names = flat.split(":"); + for (int i = 0; i < names.length; i++) { + final ComponentName cn = ComponentName.unflattenFromString(names[i]); + if (cn != null) { + if (TextUtils.equals(pkgName, cn.getPackageName())) { + return true; + } + } + } + } + return false; + } + + public static boolean gotoNotificationAccessSetting(Context context) { + try { + Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + return true; + + } catch (ActivityNotFoundException e) {//普通情况下找不到的时候需要再特殊处理找一次 + try { + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.Settings$NotificationAccessSettingsActivity"); + intent.setComponent(cn); + intent.putExtra(":settings:show_fragment", "NotificationAccessSettings"); + context.startActivity(intent); + return true; + } catch (Exception e1) { + e1.printStackTrace(); + } + Toaster.show("对不起,您的手机暂不支持"); + e.printStackTrace(); + return false; + } + } + + + @Override + protected void onRestart() { + super.onRestart(); +// mMainPresenter.sendAPPUsage(); +// mMainPresenter.sendRunningInfo(); + } + + @Override + protected void onPause() { + super.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterAllReceiver(); + RemoteManager.removeListener(this); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { +// super.onSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { +// super.onRestoreInstanceState(savedInstanceState); + } + + private void registReceiver() { + registNewAppReceiver(); + registerSOSNumberReceiver(); + registerUpdateDesktopReceiver(); + registmUpdateAddressReceiver(); + } + + private void unregisterAllReceiver() { + if (mNewAppReceiver != null) { + unregisterReceiver(mNewAppReceiver); + } + if (mSOSNumberReceiver != null) { + unregisterReceiver(mSOSNumberReceiver); + } + if (mUpdateDesktopReceiver != null) { + unregisterReceiver(mUpdateDesktopReceiver); + } + if (mUpdateAddressReceiver != null) { + unregisterReceiver(mUpdateAddressReceiver); + } + } + + private void registNewAppReceiver() { + mNewAppReceiver = new NewAppReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_PACKAGE_ADDED); + filter.addAction(Intent.ACTION_PACKAGE_CHANGED); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + registerReceiver(mNewAppReceiver, filter); + } + + private NewAppReceiver mNewAppReceiver; + + class NewAppReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e(TAG, "onReceive: " + action); + if (Intent.ACTION_PACKAGE_ADDED.equals(action) + || Intent.ACTION_PACKAGE_REMOVED.equals(action) + || Intent.ACTION_PACKAGE_CHANGED.equals(action)) { + addData(); + } + } + } + + private SOSNumberReceiver mSOSNumberReceiver; + + private void registerSOSNumberReceiver() { + if (mSOSNumberReceiver == null) { + mSOSNumberReceiver = new SOSNumberReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction("setting_sos"); + registerReceiver(mSOSNumberReceiver, filter); + } + + class SOSNumberReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.e(TAG, "onReceive: " + intent.getAction()); + String setting_sos = intent.getStringExtra("setting_sos"); + if (TextUtils.isEmpty(setting_sos)) return; +// mCustomFragment.setSosNumber(); + } + } + + public static final String ACTION_PACKAGE_HIDE = "com.uiui.aios.ACTION_PACKAGE_HIDE"; + + private UpdateDesktopReceiver mUpdateDesktopReceiver; + + private void registerUpdateDesktopReceiver() { + if (mUpdateDesktopReceiver == null) { + mUpdateDesktopReceiver = new UpdateDesktopReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction("UPDATE_DESKTOP_ICON"); + filter.addAction(ACTION_PACKAGE_HIDE); + registerReceiver(mUpdateDesktopReceiver, filter); + } + + class UpdateDesktopReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Log.e(TAG, "onReceive: " + intent.getAction()); + addData(); + } + } + + private UpdateAddressReceiver mUpdateAddressReceiver; + + private void registmUpdateAddressReceiver() { + mUpdateAddressReceiver = new UpdateAddressReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(CommonConfig.UIUIAIOS_UPDATE_ADDRESS_ACTION); + registerReceiver(mUpdateAddressReceiver, filter); + } + + class UpdateAddressReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (CommonConfig.UIUIAIOS_UPDATE_ADDRESS_ACTION.equals(action)) { + AmapManager.getInstance().startLocation(); + } + } + } + + public class BtnClick { + public void dialer(View view) { +// startActivity(new Intent(Intent.ACTION_DIAL)); + startActivity(new Intent(MainActivity.this, PhoneActivity.class)); + } + + public void mms(View v) { + ApkUtils.openPackage(MainActivity.this, "com.android.mms"); + } + + public void camera(View v) { + ApkUtils.openPackage(MainActivity.this, "com.mediatek.camera"); + } + + public void sos(View v) { + startActivity(new Intent(MainActivity.this, EmergencyActivity.class)); + } } } + diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java b/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java deleted file mode 100644 index e4abda1..0000000 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainContact.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.uiuios.aios.activity.main; - -import com.uiuios.aios.base.mvp.BasePresenter; -import com.uiuios.aios.base.mvp.BaseView; - -public class MainContact { - public interface Presenter extends BasePresenter { - /*获取系统设置*/ - void getSystemSettings(); - /*获取桌面布局*/ - void getDesktopLayout(); - /*更新桌面布局*/ - void updateDesktopLayout(); - /*上传正在运行的APP*/ - void sendAPPUsage(); - /*上传后台运行的APP*/ - void sendRunningInfo(); - /*获取负二屏开关*/ - void getAdminSnSetting(); - } - - public interface MainView extends BaseView { - void setSystemSettings(); - void getDesktopLayoutFinish(); - void updateDesktopLayoutFinish(); - void sendAPPUsageFinish(); - void sendRunningInfoFinish(); - void setAdminSnSetting(); - - } -} diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainPresenter.java b/app/src/main/java/com/uiuios/aios/activity/main/MainViewModel.java similarity index 64% rename from app/src/main/java/com/uiuios/aios/activity/main/MainPresenter.java rename to app/src/main/java/com/uiuios/aios/activity/main/MainViewModel.java index 6ed2b18..b685a4a 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainPresenter.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/MainViewModel.java @@ -1,90 +1,95 @@ package com.uiuios.aios.activity.main; -import android.content.Context; -import android.content.Intent; import android.text.TextUtils; import android.util.Log; +import androidx.lifecycle.MutableLiveData; + import com.google.gson.JsonObject; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiuios.aios.BuildConfig; +import com.uiuios.aios.base.mvvm.BaseViewModel; import com.uiuios.aios.bean.BaseResponse; -import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.bean.DesktopIcon; import com.uiuios.aios.bean.NetDesktopIcon; +import com.uiuios.aios.databinding.PhoneActivityMainBinding; +import com.uiuios.aios.manager.AppManager; import com.uiuios.aios.manager.RemoteManager; import com.uiuios.aios.network.NetInterfaceManager; import com.uiuios.aios.utils.ApkUtils; import com.uiuios.aios.utils.AppUsedTimeUtils; -import com.uiuios.aios.utils.Utils; +import java.util.ArrayList; import java.util.List; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.ObservableEmitter; +import io.reactivex.rxjava3.core.ObservableOnSubscribe; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.subjects.BehaviorSubject; +import io.reactivex.rxjava3.schedulers.Schedulers; -public class MainPresenter implements MainContact.Presenter { - private static final String TAG = MainPresenter.class.getSimpleName(); - private MainContact.MainView mView; - private Context mContext; +public class MainViewModel extends BaseViewModel { + private static final String TAG = MainViewModel.class.getSimpleName(); - private BehaviorSubject lifecycle; - - void setLifecycle(BehaviorSubject lifecycle) { - this.lifecycle = lifecycle; - } - - public BehaviorSubject getLifecycle() { - return lifecycle; - } - - MainPresenter(Context context) { - this.mContext = context; - Log.e(TAG, "MainPresenter: " + context.getClass()); + @Override + public PhoneActivityMainBinding getVDBinding() { + return binding; } @Override - public void attachView(MainContact.MainView view) { - this.mView = view; + public void onDestroy() { + } - @Override - public void detachView() { - this.mView = null; + private MutableLiveData> mDesktopIconData = new MutableLiveData<>(); + + public MutableLiveData> getDesktopIconData() { + return mDesktopIconData; } - @Override - public void getSystemSettings() { -// NetInterfaceManager.getInstance().getSystemSettings(true, getLifecycle(), new NetInterfaceManager.ContactCallback() { -// @Override -// public void setContact(List contactList) { -// Intent intent = new Intent("setting_sos"); -// mContext.sendBroadcast(intent); -// } -// -// @Override -// public void setEmergencyContact(List emergencyContact) { -// -// } -// -// @Override -// public void setEmpty() { -// -// } -// -// @Override -// public void onComplete() { -// } -// }); - mView.setSystemSettings(); + public void getAppList() { + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + emitter.onNext(AppManager.getInstance().getAllAppList()); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAppList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull ArrayList desktopIcons) { + Log.e("getAppList", "onNext: " + desktopIcons.size()); + mDesktopIconData.postValue(desktopIcons); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAppList", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAppList", "onComplete: "); + } + }); } - @Override + + @Deprecated public void getDesktopLayout() { NetInterfaceManager.getInstance().getDesktopLayoutObservable() - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -109,26 +114,21 @@ public class MainPresenter implements MainContact.Presenter { }); } - @Override - public void updateDesktopLayout() { - - } - - @Override + @Deprecated public void sendAPPUsage() { AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); String packagename = AppUsedTimeUtils.getInstance().getAppPackageName(); Log.e(TAG, "onRestart packagename == " + packagename); if (!TextUtils.isEmpty(packagename)) { - Log.e(TAG, "onRestart: " + ApkUtils.getAppNameByPackage(mContext, packagename)); + Log.e(TAG, "onRestart: " + ApkUtils.getAppNameByPackage(getCtx(), packagename)); Log.e(TAG, "onRestart: " + packagename); NetInterfaceManager.getInstance().getAppUsageRecordControl() .sendappUsageRecord(RemoteManager.getInstance().getSerial(), - ApkUtils.getAppNameByPackage(mContext, packagename), + ApkUtils.getAppNameByPackage(getCtx(), packagename), packagename, AppUsedTimeUtils.getInstance().getStartTime() / 1000, AppUsedTimeUtils.getInstance().getEndTime() / 1000) - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -149,29 +149,27 @@ public class MainPresenter implements MainContact.Presenter { @Override public void onComplete() { Log.e("sendAPPUsage", "onComplete: "); - mView.sendAPPUsageFinish(); } }); } else { Log.e("onRestart", "app = null" + packagename); - mView.sendAPPUsageFinish(); } } - @Override + @Deprecated public void sendRunningInfo() { AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); long time = AppUsedTimeUtils.getInstance().getStartTime(); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("app_package", BuildConfig.APPLICATION_ID); - jsonObject.addProperty("version_name", ApkUtils.getAPPVersionName(mContext, BuildConfig.APPLICATION_ID)); + jsonObject.addProperty("version_name", ApkUtils.getAPPVersionName(getCtx(), BuildConfig.APPLICATION_ID)); jsonObject.addProperty("start_time", time / 1000); String jsonString = jsonObject.toString(); Log.e(TAG, "sendRunningInfo: " + jsonString); NetInterfaceManager.getInstance() .getRunningAppObservable(jsonString) - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -196,9 +194,9 @@ public class MainPresenter implements MainContact.Presenter { }); } - @Override + @Deprecated public void getAdminSnSetting() { - NetInterfaceManager.getInstance().getAdminSnSetting(true, lifecycle, new NetInterfaceManager.onCompleteCallback() { + NetInterfaceManager.getInstance().getAdminSnSetting(true, getLifecycle(), new NetInterfaceManager.onCompleteCallback() { @Override public void onComplete() { diff --git a/app/src/main/java/com/uiuios/aios/activity/main/OldMainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/OldMainActivity.java new file mode 100644 index 0000000..16432b9 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/main/OldMainActivity.java @@ -0,0 +1,33 @@ +package com.uiuios.aios.activity.main; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; + +import com.uiuios.aios.R; + +public class OldMainActivity extends MainActivity { + private static final String TAG = OldMainActivity.class.getSimpleName(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.e(TAG, "onCreate: "); + } + + @Override + protected void initDataBinding() { + DataBindingUtil.setContentView(this, R.layout.activity_main_old); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + Log.e(TAG, "onNewIntent: getAction = " + intent.getAction()); + Log.e(TAG, "onNewIntent: getCategories = " + intent.getCategories()); + Log.e(TAG, "onNewIntent: getFlags = " + intent.getFlags()); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java index d933893..9c6eed9 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/PhoneMainActivity.java @@ -1,14 +1,49 @@ package com.uiuios.aios.activity.main; +import android.content.Intent; +import android.view.View; + import androidx.databinding.DataBindingUtil; import com.uiuios.aios.R; +import com.uiuios.aios.activity.EmergencyActivity; +import com.uiuios.aios.databinding.PhoneActivityMainBinding; +import com.uiuios.aios.utils.ApkUtils; -public class PhoneMainActivity extends BaseMainActivity { +public class PhoneMainActivity extends MainActivity { private static final String TAG = PhoneMainActivity.class.getSimpleName(); + PhoneActivityMainBinding mBinding; + @Override protected void initDataBinding() { - DataBindingUtil.setContentView(this, R.layout.phone_activity_main); + mBinding = DataBindingUtil.setContentView(this, R.layout.phone_activity_main); + + mBinding.cl0.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(Intent.ACTION_DIAL)); + } + }); + mBinding.cl1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ApkUtils.openPackage(PhoneMainActivity.this, "com.android.mms"); + } + }); + mBinding.cl2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ApkUtils.openPackage(PhoneMainActivity.this, "com.mediatek.camera"); + } + }); + mBinding.cl3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(PhoneMainActivity.this, EmergencyActivity.class)); + } + }); } + + } diff --git a/app/src/main/java/com/uiuios/aios/activity/phone/PhoneActivity.java b/app/src/main/java/com/uiuios/aios/activity/phone/PhoneActivity.java new file mode 100644 index 0000000..6ddc131 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/phone/PhoneActivity.java @@ -0,0 +1,85 @@ +package com.uiuios.aios.activity.phone; + +import android.view.View; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + +import com.uiuios.aios.R; +import com.uiuios.aios.base.mvvm.BaseMvvmActivity; +import com.uiuios.aios.databinding.ActivityPhoneBinding; +import com.uiuios.aios.fragment.phone.contact.ContactFragment; +import com.uiuios.aios.fragment.phone.dialer.DialerFragment; +import com.uiuios.aios.fragment.phone.record.RecordFragment; +import com.uiuios.aios.view.CustomPagerAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class PhoneActivity extends BaseMvvmActivity { + private static final String TAG = PhoneActivity.class.getSimpleName(); + + + private FragmentManager mFragmentManager; + private CustomPagerAdapter mCustomPagerAdapter; + private List mFragments; + private ContactFragment mContactFragment; + private DialerFragment mDialerFragment; + private RecordFragment mRecordFragment; + + @Override + protected int getLayoutId() { + return R.layout.activity_phone; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + mFragmentManager = getSupportFragmentManager(); + mFragments = new ArrayList<>(); + if (mContactFragment == null) { + mContactFragment = new ContactFragment(); + } + mFragments.add(mContactFragment); + if (mDialerFragment == null) { + mDialerFragment = new DialerFragment(); + } + mFragments.add(mDialerFragment); + if (mRecordFragment == null) { + mRecordFragment = new RecordFragment(); + } + mFragments.add(mRecordFragment); + mCustomPagerAdapter = new CustomPagerAdapter(mFragmentManager, mFragments, getLifecycle()); + mViewDataBinding.viewPager.setAdapter(mCustomPagerAdapter); + } + + @Override + protected void initData() { + + } + + @Override + protected void onResume() { + super.onResume(); + } + + public class BtnClick { + public void toContact(View view) { + mViewDataBinding.viewPager.setCurrentItem(0, true); + } + + public void call(View view) { + mViewDataBinding.viewPager.setCurrentItem(1, true); + } + public void toRecord(View view) { + mViewDataBinding.viewPager.setCurrentItem(2, true); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/phone/PhoneViewModel.java b/app/src/main/java/com/uiuios/aios/activity/phone/PhoneViewModel.java new file mode 100644 index 0000000..2d51551 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/activity/phone/PhoneViewModel.java @@ -0,0 +1,19 @@ +package com.uiuios.aios.activity.phone; + +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.databinding.ActivityPhoneBinding; + +public class PhoneViewModel extends BaseViewModel { + @Override + public ActivityPhoneBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + +} diff --git a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java index 7807d8b..f100819 100644 --- a/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/weather/WeatherActivity.java @@ -100,7 +100,6 @@ public class WeatherActivity extends BaseMvvmActivity>() { - @Override - public void onChanged(List jsonBeans) { - options1Items = jsonBeans; - } - }); - mViewModel.getOptions2ItemsData().observe(this, new Observer>>() { - @Override - public void onChanged(ArrayList> arrayLists) { - options2Items = arrayLists; - } - }); - mViewModel.getOptions3ItemsData().observe(this, new Observer>>>() { - @Override - public void onChanged(ArrayList>> arrayLists) { - options3Items = arrayLists; - } - }); - mViewModel.getBooleanData().observe(this, new Observer() { - @Override - public void onChanged(Boolean aBoolean) { - mLoaded = aBoolean; - } - }); - mViewModel.getGeoResultData().observe(this, new Observer() { @Override public void onChanged(MapGeoResult mapGeoResult) { if (mapGeoResult != null) { mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, mapGeoResult.getLocation().toString()); - mViewModel.getWeatherNow(mapGeoResult.getLocation().toString()); - mViewModel.getWeather7D(mapGeoResult.getLocation().toString()); + mViewModel.getWeather(mapGeoResult.getLocation().toString()); } else { Toaster.show("获取位置信息失败"); } @@ -229,8 +201,7 @@ public class WeatherActivity extends BaseMvvmActivity> mOptions1ItemsData = new MutableLiveData<>(); - private MutableLiveData>> mOptions2ItemsData = new MutableLiveData<>(); - private MutableLiveData>>> mOptions3ItemsData = new MutableLiveData<>(); - private MutableLiveData mBooleanData = new MutableLiveData<>(); - - - public MutableLiveData> getOptions1ItemsData() { - return mOptions1ItemsData; - } - - public MutableLiveData>> getOptions2ItemsData() { - return mOptions2ItemsData; - } - - public MutableLiveData>>> getOptions3ItemsData() { - return mOptions3ItemsData; - } - - public MutableLiveData getBooleanData() { - return mBooleanData; - } - private MutableLiveData mGeoResultData = new MutableLiveData<>(); private MutableLiveData mLocationData = new MutableLiveData<>(); private MutableLiveData mWeatherNowData = new MutableLiveData<>(); @@ -100,81 +80,6 @@ public class WeatherViewModel extends BaseViewModel>() { - @Override - public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { - Log.e("loadProvince", "subscribe: "); - String JsonData = new GetJsonDataUtil().getJson(getCtx(), "province.json");//获取assets目录下的json文件数据 - ArrayList detail = new ArrayList<>(); - JSONArray data = new JSONArray(JsonData); - Gson gson = new Gson(); - for (int i = 0; i < data.length(); i++) { - JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class); - detail.add(entity); - } - emitter.onNext(detail); - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("loadProvince", "onSubscribe: "); - } - - @Override - public void onNext(@NonNull ArrayList jsonBeans) { - Log.e("loadProvince", "onNext: "); - mOptions1ItemsData.setValue(jsonBeans); - - ArrayList> options2Items = new ArrayList<>(); - ArrayList>> options3Items = new ArrayList<>(); - - for (int i = 0; i < jsonBeans.size(); i++) {//遍历省份 - ArrayList cityList = new ArrayList<>();//该省的城市列表(第二级) - ArrayList> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极) - - for (int c = 0; c < jsonBeans.get(i).getCityList().size(); c++) {//遍历该省份的所有城市 - String cityName = jsonBeans.get(i).getCityList().get(c).getName(); - cityList.add(cityName);//添加城市 - ArrayList city_AreaList = new ArrayList<>();//该城市的所有地区列表 - - //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃 - /*if (jsonBean.get(i).getCityList().get(c).getArea() == null - || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) { - city_AreaList.add(""); - } else { - city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea()); - }*/ - city_AreaList.addAll(jsonBeans.get(i).getCityList().get(c).getArea()); - province_AreaList.add(city_AreaList);//添加该省所有地区数据 - } - options2Items.add(cityList); - /** - * 添加地区数据 - */ - options3Items.add(province_AreaList); - } - mOptions2ItemsData.setValue(options2Items); - mOptions3ItemsData.setValue(options3Items); - mBooleanData.setValue(true); - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("loadProvince", "onError: " + e.getMessage()); - mBooleanData.setValue(false); - } - - @Override - public void onComplete() { - Log.e("loadProvince", "onComplete: "); - } - }); - } - public void decodeGeo(String address) { Log.e(TAG, "decodeGeo: " + address); NetInterfaceManager.getInstance().getGeoObservable(address) @@ -239,6 +144,20 @@ public class WeatherViewModel extends BaseViewModel private List desktopIcons; + public void setDesktopIcons(List desktopIcons) { + this.desktopIcons = desktopIcons; + notifyDataSetChanged(); + } + private Set packageSet; + public void setPackageSet(Set packageSet) { + this.packageSet = packageSet; + } + @NonNull @Override public AppHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -42,7 +52,7 @@ public class AddAppAdapter extends RecyclerView.Adapter DesktopIcon desktopIcon = desktopIcons.get(position); String lable = desktopIcon.getTitle(); holder.tv_appname.setText(lable); - holder.iv_icon.setImageDrawable(desktopIcon.getIcon()); + holder.iv_icon.setImageDrawable(desktopIcon.getIcon(mContext)); String pkg = desktopIcon.getPackage(); if (packageSet != null) { @@ -60,15 +70,15 @@ public class AddAppAdapter extends RecyclerView.Adapter int resID = mContext.getResources().getIdentifier(val, "drawable", "com.uiui.zyos"); if (resID == 0) { Log.e(TAG, "getView: not found src : " + pkg); - holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon())); + holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon(mContext))); } else { holder.iv_icon.setImageDrawable(mContext.getResources().getDrawable(resID)); } } else { if (AppManager.ADD_NAME.equals(pkg)) { - holder.iv_icon.setImageDrawable(desktopIcon.getIcon()); + holder.iv_icon.setImageDrawable(desktopIcon.getIcon(mContext)); } else { - holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon())); + holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon(mContext))); } } holder.root.setOnClickListener(new View.OnClickListener() { @@ -78,8 +88,12 @@ public class AddAppAdapter extends RecyclerView.Adapter packageSet.remove(pkg); AppManager.getInstance().removeAddPakcage(pkg); } else { - packageSet.add(pkg); - AppManager.getInstance().addAddPakcage(pkg); + if (packageSet.size() == 6) { + Toaster.show("最多添加6个"); + } else { + packageSet.add(pkg); + AppManager.getInstance().addAddPakcage(pkg); + } } notifyDataSetChanged(); } @@ -91,15 +105,6 @@ public class AddAppAdapter extends RecyclerView.Adapter return desktopIcons == null ? 0 : desktopIcons.size(); } - public void setDesktopIcons(List desktopIcons) { - this.desktopIcons = desktopIcons; - notifyDataSetChanged(); - } - - public void setPackageSet(Set packageSet) { - this.packageSet = packageSet; - } - class AppHolder extends RecyclerView.ViewHolder { ConstraintLayout root; TextView tv_appname; diff --git a/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java index e4064b4..374bbbe 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/CallRecordAdapter.java @@ -14,24 +14,35 @@ import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.RecyclerView; +import com.shehuan.niv.NiceImageView; import com.uiuios.aios.R; +import com.uiuios.aios.bean.Contact; import com.uiuios.aios.bean.RecordsInfo; +import com.uiuios.aios.utils.GlideLoadUtils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; public class CallRecordAdapter extends RecyclerView.Adapter { private Context mContext; private List mRecordsInfoList; - private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm:ss"); + private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("MM/dd HH:mm:ss"); public void setRecordsInfoList(List recordsInfoList) { this.mRecordsInfoList = recordsInfoList; notifyDataSetChanged(); } + private Map mContactMap; + + public void setContactMap(Map contactMap) { + mContactMap = contactMap; + notifyDataSetChanged(); + } + @NonNull @Override public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -44,6 +55,8 @@ public class CallRecordAdapter extends RecyclerView.Adapter { @@ -46,13 +46,18 @@ public class ContactAdapter extends RecyclerView.Adapter { + private List mContactList; + private Context mContext; + + public static final String DIALER_PACKAGE = "com.android.dialer"; + public static final String DIALER_ADD_CONTACT = "com.uiui.aios.contact.add"; + + public void setContactList(List contactList) { + this.mContactList = contactList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ContactHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new ContactHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact_home, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ContactHolder contactHolder, int position) { + Contact contact = mContactList.get(position); + contactHolder.root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// int qch_call_forbid = Settings.System.getInt(mContext.getContentResolver(), "qch_call_forbid", 0); +// if (qch_call_forbid == 1) { +// Toaster.show("电话功能被禁用"); +// icon_return; +// } + Intent dialIntent = new Intent(Intent.ACTION_CALL); + String phone = contact.getMobile(); + if (DIALER_PACKAGE.equals(phone)) { + try { +// mContext.startActivity(new Intent(Intent.ACTION_DIAL)); +// mContext.startActivity(new Intent(mContext, DialerActivity.class)); + mContext.startActivity(new Intent(mContext, RecordsActivity.class)); + } catch (Exception e) { + Toaster.show("无法打开电话功能"); + } + } else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) { + Intent intent = new Intent(mContext, AddContactActivity.class); + mContext.startActivity(intent); + } else if (!TextUtils.isEmpty(phone)) { + Uri data = Uri.parse("tel:" + phone); + dialIntent.setData(data); + mContext.startActivity(dialIntent); + } + } + }); + contactHolder.tv_name.setText(contact.getName()); + if (DIALER_PACKAGE.equals(contact.getMobile())) { + contactHolder.cl_contact.setVisibility(View.GONE); + contactHolder.iv_head2.setVisibility(View.VISIBLE); + contactHolder.tv_phone.setText(""); + Glide.with(contactHolder.iv_head).load(R.drawable.home_dialer_cion_circle).error(R.drawable.home_dialer_cion_circle).into(contactHolder.iv_head); + } else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) { + Glide.with(contactHolder.iv_head).load(R.drawable.icon_contact_add).error(R.drawable.icon_contact_add).into(contactHolder.iv_head); + } else { + contactHolder.cl_contact.setVisibility(View.VISIBLE); + contactHolder.iv_head2.setVisibility(View.GONE); + contactHolder.tv_phone.setText(contact.getMobile()); + Glide.with(contactHolder.iv_head).load(contact.getAvatar()).error(R.drawable.default_avatar).into(contactHolder.iv_head); + } +// int index = position % 3; +// switch (index) { +// case 0: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain)); +// break; +// case 1: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sun)); +// break; +// case 2: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sunny)); +// break; +// default: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain)); +// } + } + + @Override + public int getItemCount() { + return mContactList == null ? 0 : mContactList.size(); + } + + static class ContactHolder extends RecyclerView.ViewHolder { + ConstraintLayout root; + ConstraintLayout cl_contact; + NiceImageView iv_head; + NiceImageView iv_head2; + TextView tv_name; + TextView tv_phone; + + public ContactHolder(@NonNull View itemView) { + super(itemView); + root = itemView.findViewById(R.id.root); + cl_contact = itemView.findViewById(R.id.cl_contact); + iv_head = itemView.findViewById(R.id.iv_head); + iv_head2 = itemView.findViewById(R.id.iv_head2); + tv_name = itemView.findViewById(R.id.tv_name); + tv_phone = itemView.findViewById(R.id.tv_phone); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/adapter/KnowledgeVideoAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/KnowledgeVideoAdapter.java index 73a3000..ae05816 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/KnowledgeVideoAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/KnowledgeVideoAdapter.java @@ -48,7 +48,7 @@ public class KnowledgeVideoAdapter extends RecyclerView.Adapter { + private List mContactList; + private Context mContext; + + public static final String DIALER_PACKAGE = "com.android.dialer"; + public static final String DIALER_ADD_CONTACT = "com.uiui.aios.contact.add"; + + public void setContactList(List contactList) { + this.mContactList = contactList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public ContactHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new ContactHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact_old, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ContactHolder contactHolder, int position) { + Contact contact = mContactList.get(position); + contactHolder.root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// int qch_call_forbid = Settings.System.getInt(mContext.getContentResolver(), "qch_call_forbid", 0); +// if (qch_call_forbid == 1) { +// Toaster.show("电话功能被禁用"); +// icon_return; +// } + Intent dialIntent = new Intent(Intent.ACTION_CALL); + String phone = contact.getMobile(); + if (DIALER_PACKAGE.equals(phone)) { + try { +// mContext.startActivity(new Intent(Intent.ACTION_DIAL)); +// mContext.startActivity(new Intent(mContext, DialerActivity.class)); + mContext.startActivity(new Intent(mContext, RecordsActivity.class)); + } catch (Exception e) { + Toaster.show("无法打开电话功能"); + } + } else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) { + Intent intent = new Intent(mContext, AddContactActivity.class); + mContext.startActivity(intent); + } else if (!TextUtils.isEmpty(phone)) { + Uri data = Uri.parse("tel:" + phone); + dialIntent.setData(data); + mContext.startActivity(dialIntent); + } + } + }); + contactHolder.tv_name.setText(contact.getName()); + if (DIALER_PACKAGE.equals(contact.getMobile())) { + contactHolder.cl_contact.setVisibility(View.GONE); + contactHolder.iv_head2.setVisibility(View.VISIBLE); + contactHolder.tv_phone.setText(""); + Glide.with(contactHolder.iv_head).load(R.drawable.home_dialer_cion_circle).error(R.drawable.home_dialer_cion_circle).into(contactHolder.iv_head); + } else if (DIALER_ADD_CONTACT.equals(contact.getMobile())) { + Glide.with(contactHolder.iv_head).load(R.drawable.icon_contact_add).error(R.drawable.icon_contact_add).into(contactHolder.iv_head); + } else { + contactHolder.cl_contact.setVisibility(View.VISIBLE); + contactHolder.iv_head2.setVisibility(View.GONE); + contactHolder.tv_phone.setText(contact.getMobile()); + Glide.with(contactHolder.iv_head).load(contact.getAvatar()).error(R.drawable.default_avatar).into(contactHolder.iv_head); + } +// int index = position % 3; +// switch (index) { +// case 0: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain)); +// break; +// case 1: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sun)); +// break; +// case 2: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_sunny)); +// break; +// default: +// contactHolder.root.setBackground(mContext.getDrawable(R.drawable.background_weather_rain)); +// } + } + + @Override + public int getItemCount() { + return mContactList == null ? 0 : mContactList.size(); + } + + static class ContactHolder extends RecyclerView.ViewHolder { + ConstraintLayout root; + ConstraintLayout cl_contact; + NiceImageView iv_head; + NiceImageView iv_head2; + TextView tv_name; + TextView tv_phone; + + public ContactHolder(@NonNull View itemView) { + super(itemView); + root = itemView.findViewById(R.id.root); + cl_contact = itemView.findViewById(R.id.cl_contact); + iv_head = itemView.findViewById(R.id.iv_head); + iv_head2 = itemView.findViewById(R.id.iv_head2); + tv_name = itemView.findViewById(R.id.tv_name); + tv_phone = itemView.findViewById(R.id.tv_phone); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmDialogFragment.java b/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmDialogFragment.java new file mode 100644 index 0000000..0ab9f92 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmDialogFragment.java @@ -0,0 +1,311 @@ +package com.uiuios.aios.base.mvvm.fragment; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.annotation.CallSuper; +import androidx.annotation.CheckResult; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; +import androidx.fragment.app.DialogFragment; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import com.trello.rxlifecycle4.LifecycleProvider; +import com.trello.rxlifecycle4.LifecycleTransformer; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.trello.rxlifecycle4.android.RxLifecycleAndroid; + +import java.lang.ref.WeakReference; +import java.lang.reflect.ParameterizedType; + +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public abstract class BaseMvvmDialogFragment extends DialogFragment implements LifecycleProvider { + /** + * 是否顯示了 + */ + protected boolean mIsVisible; + /** + * 是否準備好了-Created + */ + protected boolean mHasPrepare; + + + protected VM mViewModel; + protected VDB mViewDataBinding; + protected Class vmClass; + // + protected Toolbar toolbar; + protected View statusBarView; + // + protected Bundle bundle;//来自getArguments() + protected Bundle savedInstanceState; + + /** + * 上下文 + */ + private WeakReference ctx; + + public Context getCtx() { + return ctx == null ? null : ctx.get(); + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + ctx = new WeakReference<>(context); + } + + /** + * onCreate、onResume里不能调用 + * + * @return + */ + public boolean isAttached() { + boolean flag = getCtx() != null && isAdded(); + Log.d("BaseMvvmDialogFragment", " >> isAttached >> flag: " + flag); + return flag; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + //ViewDataBinding + mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false); + mViewDataBinding.setLifecycleOwner(this); + + //ViewModel + vmClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + mViewModel = new ViewModelProvider(this).get(vmClass); + // + getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + return mViewDataBinding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW); + + if (initStatusBarToolBar()) { + toolbar = getToolbar(); + } +// //注册eventbus +// if (getClass().isAnnotationPresent(BindEventBus.class)) +// EventBusManager.register(this); +// // + + fitsLayoutOverlap(); + initView(bundle = getArguments()); + // + initData(this.savedInstanceState = savedInstanceState); + // + if (mIsVisible) { + onEnter(); + } + mHasPrepare = true; + } + + @Override + public void onDestroyView() { + lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW); + super.onDestroyView(); + mHasPrepare = false; + mViewDataBinding = null; +// //移除eventbus +// if (getClass().isAnnotationPresent(BindEventBus.class)) +// EventBusManager.unregister(this); +// // + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (mIsVisible == getUserVisibleHint()) + return; + mIsVisible = getUserVisibleHint(); + if (mIsVisible) { + if (!mHasPrepare) + return; + onEnter(); + } else { + onExit(); + } + } + + @LayoutRes + protected abstract int getLayoutId(); + + protected abstract Toolbar getToolbar(); + + protected View getStatusView() { + return null; + } + + protected abstract void initView(Bundle bundle); + + protected abstract void initData(Bundle savedInstanceState); + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + fitsLayoutOverlap(); + } + + protected boolean isImmersionBarEnabled() { + return true; + } + + protected boolean initStatusBarToolBar() { + return true; + } + + + private void fitsLayoutOverlap() { + if (!isImmersionBarEnabled()) return; + if (statusBarView != null) { +// ImmersionBar.setStatusBarView(getActivity(), statusBarView); + } + if (toolbar != null) { +// ImmersionBar.setTitleBar(getActivity(), toolbar); + } + } + + protected void hideInputMethod(Activity activity) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = activity.getCurrentFocus(); + if (view != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + + protected void hideInputMethod(Activity activity, EditText editText) { + InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = activity.getCurrentFocus(); + if (view != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + protected void showInputMethod(EditText editText) { + InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); + } + + /** + * 進入界面 + */ + protected void onEnter() { + + } + + /** + * 離開界面 + */ + protected void onExit() { + + } + + + private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); + + public BehaviorSubject getLifecycleSubject() { + return lifecycleSubject; + } + + @Override + @NonNull + @CheckResult + public final Observable lifecycle() { + return lifecycleSubject.hide(); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindUntilEvent(@NonNull FragmentEvent event) { + return RxLifecycle.bindUntilEvent(lifecycleSubject, event); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindToLifecycle() { + return RxLifecycleAndroid.bindFragment(lifecycleSubject); + } + + @Override + @CallSuper + public void onAttach(Activity activity) { + super.onAttach(activity); + lifecycleSubject.onNext(FragmentEvent.ATTACH); + } + + @Override + @CallSuper + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + lifecycleSubject.onNext(FragmentEvent.CREATE); + } + + @Override + @CallSuper + public void onStart() { + super.onStart(); + lifecycleSubject.onNext(FragmentEvent.START); + + } + + @Override + @CallSuper + public void onResume() { + super.onResume(); + lifecycleSubject.onNext(FragmentEvent.RESUME); + } + + @Override + @CallSuper + public void onPause() { + lifecycleSubject.onNext(FragmentEvent.PAUSE); + super.onPause(); + } + + @Override + @CallSuper + public void onStop() { + lifecycleSubject.onNext(FragmentEvent.STOP); + super.onStop(); + } + + @Override + @CallSuper + public void onDestroy() { + lifecycleSubject.onNext(FragmentEvent.DESTROY); + super.onDestroy(); + } + + @Override + @CallSuper + public void onDetach() { + lifecycleSubject.onNext(FragmentEvent.DETACH); + super.onDetach(); + } +} diff --git a/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmFragment.java b/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmFragment.java new file mode 100644 index 0000000..cfafc3b --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/base/mvvm/fragment/BaseMvvmFragment.java @@ -0,0 +1,275 @@ +package com.uiuios.aios.base.mvvm.fragment; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import com.uiuios.aios.base.BaseFragment; + +import java.lang.ref.WeakReference; +import java.lang.reflect.ParameterizedType; + +/** + * @author: lml + * @date: 2021/12/15 + */ +public abstract class BaseMvvmFragment extends BaseFragment { + protected String mTag = this.getClass().getSimpleName(); + /** + * 是否顯示了 + */ + protected boolean mIsVisible; + /** + * 是否準備好了-Created + */ + protected boolean mHasPrepare; + + + protected VM mViewModel; + protected VDB mViewDataBinding; + protected Class vmClass; + // +// protected Toolbar toolbar; +// protected View statusBarView; + // + protected Bundle bundle;//来自getArguments() + protected Bundle savedInstanceState; + +// protected Context context; + + /** + * 上下文 + */ + private WeakReference ctx; + + public Context getCtx() { + return ctx == null ? null : ctx.get(); + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); +// this.context = context; + ctx = new WeakReference<>(context); + } + + /** + * onCreate、onResume里不能调用 + * + * @return + */ + public boolean isAttached() { + boolean flag = getCtx() != null && isAdded(); + Log.e(" >> isAttached >>", "flag = " + flag); + return flag; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + //ViewDataBinding + mViewDataBinding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false); + mViewDataBinding.setLifecycleOwner(this); + + //ViewModel + vmClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + mViewModel = new ViewModelProvider(this).get(vmClass); + // + return mViewDataBinding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + +// if (initStatusBarToolBar()) { +// toolbar = getToolbar(); +// } + //注册eventbus +// if (getClass().isAnnotationPresent(BindEventBus.class)) +// EventBusManager.register(this); + // + +// fitsLayoutOverlap(); + initDataBinding(); + initView(bundle = getArguments()); + // + initData(this.savedInstanceState = savedInstanceState); + // + if (mIsVisible) { + onEnter(); + } + mHasPrepare = true; + // +// LiveDataBus.get().with(ConstantUtils.DATA_BUS_LOADING_FRAGMENT, Boolean.class).observe(getActivity(), bool -> { +// L.e(" >> LiveDataBus >> DATA_BUS_LOADING_FRAGMENT: %s", bool); +// if(bool) { +// showLoading(R.string.str_please_wait); +// } else { +// hideLoading(); +// } +// }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mHasPrepare = false; + mViewDataBinding = null; + //移除eventbus +// if (getClass().isAnnotationPresent(BindEventBus.class)) +// EventBusManager.unregister(this); + // + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (mIsVisible == getUserVisibleHint()) + return; + mIsVisible = getUserVisibleHint(); + if (mIsVisible) { + if (!mHasPrepare) + return; + onEnter(); + } else { + onExit(); + } + } + + @LayoutRes + protected abstract int getLayoutId(); + +// protected abstract Toolbar getToolbar(); + +// protected View getStatusView() { +// return null; +// } + + protected abstract void initDataBinding(); + + protected abstract void initView(Bundle bundle); + + protected abstract void initData(Bundle savedInstanceState); + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); +// fitsLayoutOverlap(); + } + +// protected boolean isImmersionBarEnabled() { +// return true; +// } + +// protected boolean initStatusBarToolBar() { +// return true; +// } + + +// private void fitsLayoutOverlap() { +// if (!isImmersionBarEnabled()) return; +// if (statusBarView != null) { +// ImmersionBar.setStatusBarView(getActivity(), statusBarView); +// } +// if (toolbar != null) { +// ImmersionBar.setTitleBar(getActivity(), toolbar); +// } +// } + + protected void hideInputMethod(Activity activity) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = activity.getCurrentFocus(); + if (view != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + + protected void hideInputMethod(Activity activity, EditText editText) { + InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = activity.getCurrentFocus(); + if (view != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + protected void showInputMethod(EditText editText) { + InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); + } + + +// private CustomDialog mWaitDialog; +// +// public void showLoading(@StringRes int contentID) { +// showLoading(contentID, R.color.white); +// } +// +// public void showLoading(@StringRes int contentID, @ColorRes int color) { +// hideLoading(); +// DialogX.init(getActivity()); +// if (color == R.color.white) { +// mWaitDialog = DialogXUtil.getInstance().showLoading(getActivity(), getString(contentID), getResources().getColor(color)); +// } else { +// mWaitDialog = DialogXUtil.getInstance().showLoading_black(getActivity(), getString(contentID), getResources().getColor(color)); +// } +// } +// +// public void updateLoadingTip(@StringRes int messageID, int percent) { +// try { +// if (mWaitDialog != null && mWaitDialog.isShow()) { +// TextView tvTip = mWaitDialog.getCustomView().findViewById(R.id.tv_load_tip); +// if (tvTip != null) +// tvTip.setText(getResources().getString(messageID) + (percent == -1 ? "" : percent + "%")); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// public boolean isShowLoading() { +// return mWaitDialog != null && mWaitDialog.isShow(); +// } +// +// public void hideLoading() { +// try { +// boolean isShow = isShowLoading(); +// L.d(" >> hideLoading :: isShow: %s", isShow); +// if (isShow) +// mWaitDialog.dismiss(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + /** + * 進入界面 + */ + protected void onEnter() { + + } + + /** + * 離開界面 + */ + protected void onExit() { + + } + +} diff --git a/app/src/main/java/com/uiuios/aios/bean/Contact.java b/app/src/main/java/com/uiuios/aios/bean/Contact.java index fdb1499..d6deca4 100644 --- a/app/src/main/java/com/uiuios/aios/bean/Contact.java +++ b/app/src/main/java/com/uiuios/aios/bean/Contact.java @@ -15,6 +15,17 @@ public class Contact implements Serializable { int is_urgent;//是否紧急联系人 0否1是 String mobile;//手机号 String avatar;//头像 + boolean simContact; + + public Contact() { + + } + + public Contact(String name, String mobile, boolean sim) { + this.name = name; + this.mobile = mobile; + this.simContact = sim; + } public int getId() { return id; @@ -56,6 +67,14 @@ public class Contact implements Serializable { this.avatar = avatar; } + public boolean isSimContact() { + return simContact; + } + + public void setSimContact(boolean simContact) { + this.simContact = simContact; + } + @NonNull @Override public String toString() { diff --git a/app/src/main/java/com/uiuios/aios/bean/DailyAppBean.java b/app/src/main/java/com/uiuios/aios/bean/DailyAppBean.java index 3f428b8..553460a 100644 --- a/app/src/main/java/com/uiuios/aios/bean/DailyAppBean.java +++ b/app/src/main/java/com/uiuios/aios/bean/DailyAppBean.java @@ -1,7 +1,12 @@ package com.uiuios.aios.bean; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import com.uiuios.aios.utils.IconUtils; + import java.io.Serializable; public class DailyAppBean implements Serializable { @@ -10,13 +15,11 @@ public class DailyAppBean implements Serializable { String appName; String packageName; String className; - Drawable icon; - public DailyAppBean(String appName, String packageName, String className, Drawable icon) { + public DailyAppBean(String appName, String packageName, String className) { this.appName = appName; this.packageName = packageName; this.className = className; - this.icon = icon; } public String getAppName() { @@ -43,11 +46,26 @@ public class DailyAppBean implements Serializable { this.className = className; } - public Drawable getIcon() { - return icon; - } - - public void setIcon(Drawable icon) { - this.icon = icon; + public Drawable getIcon(Context context) { + PackageManager pm = context.getPackageManager(); + ApplicationInfo info = null; + try { + info = pm.getApplicationInfo(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (info == null) { + return null; + } else { + int i = IconUtils.appClassNameList.indexOf(packageName); + if (i != -1) { + String val = IconUtils.appIconList.get(i); + int resID = context.getResources().getIdentifier(val, "drawable", "com.uiuios.aios"); + if (resID != 0) { + return context.getResources().getDrawable(resID); + } + } + return info.loadIcon(pm); + } } } diff --git a/app/src/main/java/com/uiuios/aios/bean/DesktopIcon.java b/app/src/main/java/com/uiuios/aios/bean/DesktopIcon.java index bd6090c..cbae543 100644 --- a/app/src/main/java/com/uiuios/aios/bean/DesktopIcon.java +++ b/app/src/main/java/com/uiuios/aios/bean/DesktopIcon.java @@ -1,6 +1,7 @@ package com.uiuios.aios.bean; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; @@ -11,6 +12,9 @@ import androidx.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.JsonParser; +import com.uiuios.aios.R; +import com.uiuios.aios.manager.AppManager; +import com.uiuios.aios.utils.IconUtils; import java.io.Serializable; @@ -20,7 +24,6 @@ public class DesktopIcon implements Serializable, Parcelable { protected String mTitle; protected String mClass; protected String mPackage; - protected Drawable icon; int position; @@ -74,14 +77,6 @@ public class DesktopIcon implements Serializable, Parcelable { this.mClass = aClass; } - public Drawable getIcon() { - return icon; - } - - public void setIcon(Drawable icon) { - this.icon = icon; - } - public String getTitle() { return mTitle; } @@ -98,12 +93,43 @@ public class DesktopIcon implements Serializable, Parcelable { this.position = position; } + public Drawable getIcon(Context context) { + switch (mPackage) { + case AppManager.ADD_NAME: + return context.getDrawable(R.drawable.home_icon_add); + case "aios.daily.app": + return context.getDrawable(R.drawable.icon_daily_app); + case "aios.appstore": + return context.getDrawable(R.drawable.com_android_appstore); + default: + PackageManager pm = context.getPackageManager(); + ApplicationInfo info = null; + try { + info = pm.getApplicationInfo(mPackage, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (info == null) { + return null; + } else { + int i = IconUtils.appClassNameList.indexOf(mPackage); + if (i != -1) { + String val = IconUtils.appIconList.get(i); + int resID = context.getResources().getIdentifier(val, "drawable", "com.uiuios.aios"); + if (resID != 0) { + return context.getResources().getDrawable(resID); + } + } + return info.loadIcon(pm); + } + } + } + public static DesktopIcon creatDesktopIcon(Context context, ResolveInfo resolveInfo) { PackageManager pm = context.getPackageManager(); DesktopIcon desktopIcon = new DesktopIcon(); desktopIcon.setPackage(resolveInfo.activityInfo.packageName); desktopIcon.setClass(resolveInfo.activityInfo.name); - desktopIcon.setIcon(resolveInfo.loadIcon(pm)); desktopIcon.setTitle(resolveInfo.loadLabel(pm).toString()); desktopIcon.setPosition(0); return desktopIcon; @@ -114,7 +140,6 @@ public class DesktopIcon implements Serializable, Parcelable { DesktopIcon desktopIcon = new DesktopIcon(); desktopIcon.setPackage(resolveInfo.activityInfo.packageName); desktopIcon.setClass(resolveInfo.activityInfo.name); - desktopIcon.setIcon(resolveInfo.loadIcon(pm)); desktopIcon.setTitle(resolveInfo.loadLabel(pm).toString()); desktopIcon.setPosition(position); return desktopIcon; diff --git a/app/src/main/java/com/uiuios/aios/config/CommonConfig.java b/app/src/main/java/com/uiuios/aios/config/CommonConfig.java index f879222..a53fa3c 100644 --- a/app/src/main/java/com/uiuios/aios/config/CommonConfig.java +++ b/app/src/main/java/com/uiuios/aios/config/CommonConfig.java @@ -27,6 +27,8 @@ public class CommonConfig { /*是否激活接口请求缓存*/ public static final String ACTIVATION_BEAN_KEY = "AIOS_UIUI_ACTIVATION_BEAN_KEY"; + + /*是否激活*/ public static final String UIUI_ACTIVATION_KEY = "aios_uiui_activation"; /*激活码类型*/ @@ -34,10 +36,13 @@ public class CommonConfig { /*体验到期时间戳*/ public static final String UIUI_EXPIRE_TIME_KEY = "aios_uiui_expire_time"; + public static final String SETTING_OTHER_APPINSTALLER_KEY = "setting_other_appInstaller"; public static final String VIDEO_INFO_BUNDLE = "video_bundle_info"; + /*是否手动选择位置地址*/ + public static final String MANUALLY_SELECT_LOCATION_KEY = "map_manually_select_location"; /*手动选择位置地址*/ public static final String MANUALLY_SELECT_LOCATION_ADDRESS = "map_manually_select_location"; /*手动选择位置 区*/ diff --git a/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java b/app/src/main/java/com/uiuios/aios/fragment/app/AppListFragment.java similarity index 88% rename from app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java rename to app/src/main/java/com/uiuios/aios/fragment/app/AppListFragment.java index ddebac8..fcdf6fb 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/AppListFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/app/AppListFragment.java @@ -1,4 +1,4 @@ -package com.uiuios.aios.fragment; +package com.uiuios.aios.fragment.app; import android.app.ActivityOptions; import android.content.Context; @@ -27,13 +27,14 @@ import com.hjq.toast.Toaster; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiuios.aios.R; -import com.uiuios.aios.activity.DailyAppActivity; import com.uiuios.aios.activity.ScreenLockActivity; -import com.uiuios.aios.activity.main.MainActivity; -import com.uiuios.aios.base.BaseFragment; +import com.uiuios.aios.activity.dailyapp.DailyAppActivity; +import com.uiuios.aios.activity.main.OldMainActivity; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.DesktopIcon; import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentApplistBinding; import com.uiuios.aios.dialog.DailyAppDialog; import com.uiuios.aios.dialog.ShortcutDialog; import com.uiuios.aios.manager.AppManager; @@ -46,7 +47,6 @@ import com.uiuios.aios.shortcut.ShortcutUtils; import com.uiuios.aios.utils.ApkUtils; import com.uiuios.aios.utils.AppUsedTimeUtils; import com.uiuios.aios.utils.IconUtils; - import com.uiuios.aios.view.MyGridLayout; import java.util.ArrayList; @@ -60,7 +60,7 @@ import io.reactivex.rxjava3.disposables.Disposable; * Use the {@link AppListFragment#newInstance} factory method to * create an instance of this fragment. */ -public class AppListFragment extends BaseFragment { +public class AppListFragment extends BaseMvvmFragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; @@ -70,7 +70,6 @@ public class AppListFragment extends BaseFragment { private String mParam1; private String mParam2; - private Context mContext; private ArrayList mDesktopIcons; private MyGridLayout gridLayout; private String TAG = AppListFragment.class.getSimpleName(); @@ -115,35 +114,35 @@ public class AppListFragment extends BaseFragment { } - private View rootView; - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - rootView = inflater.inflate(R.layout.fragment_applist, container, false); - mContext = rootView.getContext(); - mLauncherApps = (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE); - initView(); - return rootView; + protected int getLayoutId() { + return R.layout.fragment_applist; } - private void initView() { + @Override + protected void initDataBinding() { + mViewModel.setCtx(getCtx()); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + } + + @Override + protected void initView(Bundle bundle) { if (mDesktopIcons.size() != 12) { mDesktopIcons.addAll(new ArrayList<>(Arrays.asList(new DesktopIcon[12 - mDesktopIcons.size()]))); } - gridLayout = rootView.findViewById(R.id.list); - if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - gridLayout.set(4, 3); + gridLayout = getActivity().findViewById(R.id.list); + if (getCtx().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + gridLayout.set(3, 3); } else { - gridLayout.set(3, 4); + gridLayout.set(3, 3); } gridLayout.setGridAdapter(new MyGridLayout.GridAdatper() { @Override public View getView(int index) { - PackageManager pm = rootView.getContext().getPackageManager(); - View view = getLayoutInflater().inflate(R.layout.item_actions, - null); + PackageManager pm = getCtx().getPackageManager(); + View view = getLayoutInflater().inflate(R.layout.item_actions, null); ImageView iv = view.findViewById(R.id.iv); ImageView iv_app = view.findViewById(R.id.iv_app); TextView tv = view.findViewById(R.id.tv); @@ -154,7 +153,7 @@ public class AppListFragment extends BaseFragment { String pkg = desktopIcon.getPackage(); if (desktopIcon instanceof ShortcutPkgInfo) { iv_app.setVisibility(View.VISIBLE); - iv_app.setImageDrawable(ApkUtils.getAppDrawable(mContext, pkg)); + iv_app.setImageDrawable(ApkUtils.getAppDrawable(getCtx(), pkg)); } else { iv_app.setVisibility(View.GONE); } @@ -172,7 +171,7 @@ public class AppListFragment extends BaseFragment { } if ("aios.daily.app".equals(pkg)) { - int appSize = AppStatusManager.getInstance().getPackageList().size(); + long appSize = AppStatusManager.getInstance().getPackageListSize(); if (appSize == 0) { bg.setVisibility(View.GONE); } else { @@ -185,13 +184,13 @@ public class AppListFragment extends BaseFragment { int resID = getActivity().getResources().getIdentifier(val, "drawable", "com.uiuios.aios"); if (resID == 0) { Log.e(TAG, "getView: not found src : " + pkg); - iv.setImageDrawable(desktopIcon.getIcon()); + iv.setImageDrawable(desktopIcon.getIcon(getCtx())); } else { iv.setImageDrawable(getActivity().getResources().getDrawable(resID)); - desktopIcon.setIcon(mContext.getResources().getDrawable(resID)); +// desktopIcon.setIcon(getCtx().getResources().getDrawable(resID)); } } else { - iv.setImageDrawable(desktopIcon.getIcon()); + iv.setImageDrawable(desktopIcon.getIcon(getCtx())); } tv.setText(desktopIcon.getTitle()); // linearLayout.setEnabled(true); @@ -231,10 +230,10 @@ public class AppListFragment extends BaseFragment { } switch (desktopIcon.getPackage()) { case "aios.daily.app": - startActivity(new Intent(mContext, DailyAppActivity.class)); + startActivity(new Intent(getCtx(), DailyAppActivity.class)); break; case "aios.exit": - int is_activation = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0); + int is_activation = Settings.Global.getInt(getCtx().getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0); if (is_activation == 0) { RemoteManager.getInstance().openLauncher3(); } else { @@ -243,10 +242,10 @@ public class AppListFragment extends BaseFragment { break; case "aios.family": // startActivity(new Intent(mContext, FamilySpaceActivity.class)); - ApkUtils.openApp(mContext, "com.uiui.videoplayer"); + ApkUtils.openApp(getCtx(), "com.uiui.videoplayer"); break; case "aios.appstore": - ApkUtils.openApp(mContext, "com.uiuios.appstore"); + ApkUtils.openApp(getCtx(), "com.uiuios.appstore"); break; case "com.android.dialer": // int aole_call_forbid = Settings.System.getInt(mContext.getContentResolver(), "aole_call_forbid", 0); @@ -270,9 +269,9 @@ public class AppListFragment extends BaseFragment { // SendRunningApp(getActivity()); break; default: - int setting_other_appInstaller = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.SETTING_OTHER_APPINSTALLER_KEY, 1); + int setting_other_appInstaller = Settings.Global.getInt(getCtx().getContentResolver(), CommonConfig.SETTING_OTHER_APPINSTALLER_KEY, 1); if (setting_other_appInstaller == 0 - && !ApkUtils.isSystemApp(mContext, desktopIcon.getPackage() + && !ApkUtils.isSystemApp(getCtx(), desktopIcon.getPackage() )) { Toaster.show("已禁止应用打开"); } else { @@ -308,6 +307,13 @@ public class AppListFragment extends BaseFragment { }); } + + @Override + protected void initData(Bundle savedInstanceState) { + + } + + private void updateAppDisableStatus(String pkg, String label) { AppManager.getInstance().addAddPakcage(pkg); NetInterfaceManager.getInstance().getUpdateAppIconObservable(pkg, label, 0) @@ -344,26 +350,26 @@ public class AppListFragment extends BaseFragment { } private void startScreenLockActivity() { - Intent intent = new Intent(mContext, ScreenLockActivity.class); - mContext.startActivity(intent); + Intent intent = new Intent(getCtx(), ScreenLockActivity.class); + getCtx().startActivity(intent); } private void showShortcutDialog(ShortcutPkgInfo shortcutPkgInfo) { if (shortcutPkgInfo == null) return; String label = shortcutPkgInfo.getTitle(); String pkg = shortcutPkgInfo.getPackage(); - ShortcutDialog shortcutDialog = new ShortcutDialog(mContext); + ShortcutDialog shortcutDialog = new ShortcutDialog(getCtx()); shortcutDialog.setTitle("删除快捷方式"); shortcutDialog.setMessage(label); - shortcutDialog.setIconImage(shortcutPkgInfo.getIcon()); - shortcutDialog.setAppIconImage(ApkUtils.getAppDrawable(mContext, pkg)); + shortcutDialog.setIconImage(shortcutPkgInfo.getIcon(getCtx())); + shortcutDialog.setAppIconImage(ApkUtils.getAppDrawable(getCtx(), pkg)); shortcutDialog.setOnClickBottomListener(new ShortcutDialog.OnClickBottomListener() { @Override public void onPositiveClick() { if (!ShortcutUtils.getInstance().deleteShortcut(shortcutPkgInfo.getId(), shortcutPkgInfo.getPackageName())) { Toaster.show("删除失败"); } - mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); + getCtx().sendBroadcast(new Intent(OldMainActivity.ACTION_PACKAGE_HIDE)); shortcutDialog.dismiss(); } @@ -378,10 +384,10 @@ public class AppListFragment extends BaseFragment { private void showHideDialog(DesktopIcon desktopIcon) { String label = desktopIcon.getTitle(); String pkg = desktopIcon.getPackage(); - DailyAppDialog dailyAppDialog = new DailyAppDialog(mContext); + DailyAppDialog dailyAppDialog = new DailyAppDialog(getCtx()); dailyAppDialog.setTitle("移到日常应用"); dailyAppDialog.setMessage(label); - dailyAppDialog.setIconImage(desktopIcon.getIcon()); + dailyAppDialog.setIconImage(desktopIcon.getIcon(getCtx())); dailyAppDialog.setOnClickBottomListener(new DailyAppDialog.OnClickBottomListener() { @Override public void onPositiveClick() { @@ -435,6 +441,7 @@ public class AppListFragment extends BaseFragment { public void setAppList(ArrayList appList) { this.mDesktopIcons = appList; + } @Override diff --git a/app/src/main/java/com/uiuios/aios/fragment/app/AppListViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/app/AppListViewModel.java new file mode 100644 index 0000000..0be81ca --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/app/AppListViewModel.java @@ -0,0 +1,17 @@ +package com.uiuios.aios.fragment.app; + +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.databinding.FragmentApplistBinding; + +public class AppListViewModel extends BaseViewModel { + @Override + public FragmentApplistBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/contact/ContactFragment.java b/app/src/main/java/com/uiuios/aios/fragment/contact/ContactFragment.java new file mode 100644 index 0000000..6a28ca0 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/contact/ContactFragment.java @@ -0,0 +1,83 @@ +package com.uiuios.aios.fragment.contact; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.uiuios.aios.R; +import com.uiuios.aios.activity.contact.AddContactActivity; +import com.uiuios.aios.adapter.HomeContactAdapter; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.databinding.FragmentContactHomeBinding; + +import java.util.List; + +public class ContactFragment extends BaseMvvmFragment { + private static final String TAG = ContactFragment.class.getSimpleName(); + + + private HomeContactAdapter mContactAdapter; + + @Override + protected int getLayoutId() { + return R.layout.fragment_contact_home; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(getCtx()); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView(Bundle bundle) { + mContactAdapter = new HomeContactAdapter(); + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(getContext(), 3)); + } else { + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(getContext(), 2)); + } + mViewDataBinding.rvContact.setAdapter(mContactAdapter); + } + + @Override + protected void initData(Bundle savedInstanceState) { + mViewModel.getContactList().observe(this, new Observer>() { + @Override + public void onChanged(List contacts) { + if (contacts == null || contacts.size() == 0) { +// mViewDataBinding.tvPeople.setText("暂无数据"); + } else { +// mViewDataBinding.tvPeople.setText(contacts.size() + "人"); + } +// Contact contact = new Contact(); +// contact.setName("拨号"); +// contact.setMobile(OldContactAdapter.DIALER_PACKAGE); +// contacts.add(0, contact); + mContactAdapter.setContactList(contacts); + } + }); + } + + @Override + public void fetchData() { + Log.e(TAG, "fetchData: "); + mViewModel.getContact(); + } + + public class BtnClick { + + public void toAdd(View view) { + Intent intent = new Intent(getContext(), AddContactActivity.class); + startActivity(intent); + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/contact/ContactViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/contact/ContactViewModel.java new file mode 100644 index 0000000..1e3659c --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/contact/ContactViewModel.java @@ -0,0 +1,92 @@ +package com.uiuios.aios.fragment.contact; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentContactHomeBinding; +import com.uiuios.aios.gson.GsonUtils; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.network.UrlAddress; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class ContactViewModel extends BaseViewModel { + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + @Override + public FragmentContactHomeBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mContactList = new MutableLiveData<>(); + + public MutableLiveData> getContactList() { + return mContactList; + } + + public void getContact() { + NetInterfaceManager.getInstance() + .getContactListObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getContactList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getContactList", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(listBaseResponse.data)); + mContactList.setValue(listBaseResponse.data); + } else { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); + mContactList.setValue(new ArrayList<>()); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getContactList", "onError: " + e.getMessage()); + String jsonString = mMMKV.getString(UrlAddress.GET_MAIL_LIST, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List contacts = gson.fromJson(jsonString, type); + if (contacts == null) { + mContactList.setValue(new ArrayList<>()); + } else { + mContactList.setValue(contacts); + } + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getContactList", "onComplete: "); + } + }); + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/ControlFragment.java b/app/src/main/java/com/uiuios/aios/fragment/control/ControlFragment.java similarity index 89% rename from app/src/main/java/com/uiuios/aios/fragment/ControlFragment.java rename to app/src/main/java/com/uiuios/aios/fragment/control/ControlFragment.java index 697805d..67ea6c3 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/ControlFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/control/ControlFragment.java @@ -1,4 +1,4 @@ -package com.uiuios.aios.fragment; +package com.uiuios.aios.fragment.control; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; @@ -26,36 +26,28 @@ import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; -import android.widget.ImageView; import android.widget.SeekBar; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; import com.hjq.toast.Toaster; +import com.jeremyliao.liveeventbus.LiveEventBus; import com.tencent.mmkv.MMKV; import com.uiuios.aios.R; -import com.uiuios.aios.activity.ControlActivity; -import com.uiuios.aios.activity.SplashActivity; -import com.uiuios.aios.activity.main.MainActivity; -import com.uiuios.aios.activity.main.PhoneMainActivity; -import com.uiuios.aios.base.BaseFragment; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; +import com.uiuios.aios.bean.MapBean; import com.uiuios.aios.config.CommonConfig; -import com.uiuios.aios.disklrucache.CacheHelper; +import com.uiuios.aios.databinding.PhoneFragmentControlBinding; import com.uiuios.aios.manager.AmapManager; import com.uiuios.aios.manager.RemoteManager; import com.uiuios.aios.utils.BrightnessUtils; -import com.uiuios.aios.utils.Utils; -import com.uiuios.aios.view.RulerSeekBar; - import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; @@ -63,48 +55,14 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * A simple {@link Fragment} subclass. * Use the {@link ControlFragment#newInstance} factory method to * create an instance of this fragment. */ -public class ControlFragment extends BaseFragment { +public class ControlFragment extends BaseMvvmFragment { private static final String TAG = ControlFragment.class.getSimpleName(); - @BindView(R.id.tv_wifi) - TextView tv_wifi; - @BindView(R.id.tv_battery) - TextView tv_battery; - - @BindView(R.id.seekBar) - RulerSeekBar seekBar; - @BindView(R.id.seekbar_brightness) - SeekBar seekbar_brightness; - @BindView(R.id.seekbar_sound) - SeekBar seekbar_sound; - - @BindView(R.id.tv_sound) - TextView tv_sound; - @BindView(R.id.tv_brightness) - TextView tv_brightness; - @BindView(R.id.tv_location) - TextView tv_location; - @BindView(R.id.cl_wifi) - ConstraintLayout cl_wifi; - @BindView(R.id.cl_bt) - ConstraintLayout cl_bt; - @BindView(R.id.cl_battery) - ConstraintLayout cl_battery; - @BindView(R.id.cl_flashlight) - ConstraintLayout cl_flashlight; - @BindView(R.id.cl_location) - ConstraintLayout cl_location; - - - private View rootView; private Context mContext; private ContentResolver mCRv; @@ -162,34 +120,30 @@ public class ControlFragment extends BaseFragment { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - long time = System.currentTimeMillis(); - Log.e(TAG, "onCreateView: rootView = " + rootView); - if (null != rootView) { - ViewGroup parent = (ViewGroup) rootView.getParent(); - if (null != parent) { - parent.removeView(rootView); - } - } else { // 如ongoing果rootView为空 ,就实例化该视图 - if (Utils.isTablet(container.getContext())) { - rootView = inflater.inflate(R.layout.fragment_control, container, false); - } else { - rootView = inflater.inflate(R.layout.phone_fragment_control, container, false); - } - mContext = rootView.getContext(); - mCRv = mContext.getContentResolver(); - ButterKnife.bind(this, rootView); - initView(); - initData(); - } - Log.e(TAG, "onCreateView: tiem = " + (System.currentTimeMillis() - time)); - return rootView; + protected int getLayoutId() { + return R.layout.phone_fragment_control; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mCRv = mContext.getContentResolver(); + mViewModel.setCtx(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + } + + @Override + protected void initView(Bundle bundle) { + initView(); + } + + @Override + protected void initData(Bundle savedInstanceState) { + initData(); } private void initView() { - mCRv = mContext.getContentResolver(); getWifi(); registerReceivers(); getBluetooth(); @@ -201,7 +155,7 @@ public class ControlFragment extends BaseFragment { getLocation(); getBrightness(); getSound(); - cl_flashlight.setOnClickListener(new View.OnClickListener() { + mViewDataBinding.clFlashlight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { @@ -212,7 +166,7 @@ public class ControlFragment extends BaseFragment { } } }); - cl_battery.setOnClickListener(new View.OnClickListener() { + mViewDataBinding.clBattery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS)); @@ -237,11 +191,18 @@ public class ControlFragment extends BaseFragment { }; private void initData() { - + LiveEventBus.get("MapBean", MapBean.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable MapBean mapBean) { + Toaster.showShort("刷新成功"); + mViewDataBinding.tvLocation.setText(mapBean.getAddress()); + } + }); } private void getWifi() { - cl_wifi.setOnClickListener(new View.OnClickListener() { + mViewDataBinding.clWifi.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); @@ -379,7 +340,7 @@ public class ControlFragment extends BaseFragment { // tv_bt_ssid.setText("已关闭"); } getConnectedDevicesV1(); - cl_bt.setOnClickListener(new View.OnClickListener() { + mViewDataBinding.clBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)); @@ -552,11 +513,11 @@ public class ControlFragment extends BaseFragment { int level = getBatteryCapacity(); Log.e(TAG, "getBattery: " + level); if (level <= 20) { - tv_battery.setTextColor(mContext.getColor(R.color.red)); + mViewDataBinding.tvBattery.setTextColor(mContext.getColor(R.color.red)); } else { - tv_battery.setTextColor(mContext.getColor(R.color.control_text_color)); + mViewDataBinding.tvBattery.setTextColor(mContext.getColor(R.color.control_text_color)); } - tv_battery.setText(level + "%"); + mViewDataBinding.tvBattery.setText(level + "%"); if (isBatteryCharging()) { // cl_battery.setBackground(mContext.getDrawable(R.drawable.control_background_item)); @@ -805,7 +766,7 @@ public class ControlFragment extends BaseFragment { Log.e(TAG, "getHardware: fontScale = " + fontScale); List mEntries = Arrays.asList(getResources().getStringArray(R.array.entries_font_size)); List strEntryValues = Arrays.asList(getResources().getStringArray(R.array.entryvalues_font_size)); - seekBar.setMax(mEntries.size() - 1); + mViewDataBinding.seekBar.setMax(mEntries.size() - 1); String font_size; int index = strEntryValues.indexOf(String.valueOf(fontScale)); if (index == -1) { @@ -814,8 +775,8 @@ public class ControlFragment extends BaseFragment { font_size = mEntries.get(index); } // tv_font_size.setText(font_size); - seekBar.setProgress(index); - seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + mViewDataBinding.seekBar.setProgress(index); + mViewDataBinding.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { Settings.System.putFloat(mCRv, Settings.System.FONT_SCALE, Float.parseFloat(strEntryValues.get(i))); @@ -837,11 +798,11 @@ public class ControlFragment extends BaseFragment { String addr = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE).decodeString(CommonConfig.MAP_ADDRESS_KEY); if (TextUtils.isEmpty(addr) || "nullnull".equals(addr) || "null".equals(addr)) { - tv_location.setText("未能获取到位置信息"); + mViewDataBinding.tvLocation.setText("未能获取到位置信息"); } else { - tv_location.setText(addr); + mViewDataBinding.tvLocation.setText(addr); } - cl_location.setOnClickListener(new View.OnClickListener() { + mViewDataBinding.clLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AmapManager.getInstance().startLocation(); @@ -850,17 +811,17 @@ public class ControlFragment extends BaseFragment { } private void getBrightness() { - seekbar_brightness.setMax(255); + mViewDataBinding.seekbarBrightness.setMax(255); //亮度 int brightness = Settings.System.getInt(mCRv, Settings.System.SCREEN_BRIGHTNESS, 1); - seekbar_brightness.setProgress(brightness); + mViewDataBinding.seekbarBrightness.setProgress(brightness); Log.e(TAG, "getHardware: brightness = " + brightness); int gamma = BrightnessUtils.convertLinearToGamma(brightness, 1, 255); Log.e(TAG, "getHardware: gamma = " + gamma); long percentage = Math.round((((double) gamma / 65535) * 100f)); // tv_brightness.setText(percentage + "%"); Log.e(TAG, "getHardware: percentage = " + percentage); - seekbar_brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + mViewDataBinding.seekbarBrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { Log.e(TAG, "onProgressChanged: i = " + i); @@ -899,20 +860,20 @@ public class ControlFragment extends BaseFragment { mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); //最大音量 int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); - seekbar_sound.setMax(maxVolume); + mViewDataBinding.seekbarSound.setMax(maxVolume); Log.e(TAG, "getHardware: maxVolume = " + maxVolume); //音量 int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); - seekbar_sound.setProgress(streamVolume); + mViewDataBinding.seekbarSound.setProgress(streamVolume); Log.e(TAG, "getHardware: streamVolume = " + streamVolume); int currentVolume = (int) (((double) streamVolume / (double) maxVolume) * 100f); Log.e(TAG, "getHardware: currentVolume = " + currentVolume); - tv_sound.setText(currentVolume + "%"); - seekbar_sound.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + mViewDataBinding.tvSound.setText(currentVolume + "%"); + mViewDataBinding.seekbarSound.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { int volume = (int) (((double) i / (double) maxVolume) * 100f); - tv_sound.setText(volume + "%"); + mViewDataBinding.tvSound.setText(volume + "%"); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0); } diff --git a/app/src/main/java/com/uiuios/aios/fragment/control/ControlViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/control/ControlViewModel.java new file mode 100644 index 0000000..a31f855 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/control/ControlViewModel.java @@ -0,0 +1,20 @@ +package com.uiuios.aios.fragment.control; + +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.databinding.PhoneFragmentControlBinding; + +public class ControlViewModel extends BaseViewModel { + @Override + public PhoneFragmentControlBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + + +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java index f1c2cb8..383fef1 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/custom/CustomFragment.java @@ -569,7 +569,7 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom cl_appstore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - ApkUtils.openPackage(mContext, "com.uiui.videoplayer", "com.uiui.videoplayer.activity.main.MainActivity"); + ApkUtils.openPackage(mContext, "com.uiui.videoplayer", "com.uiui.videoplayer.activity.main.OldMainActivity"); } }); cl_wifi.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java deleted file mode 100644 index 2a59203..0000000 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomeContact.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.uiuios.aios.fragment.home; - -import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.base.mvp.BasePresenter; -import com.uiuios.aios.base.mvp.BaseView; -import com.uiuios.aios.bean.DesktopIcon; - -import java.util.ArrayList; -import java.util.List; - -public class HomeContact { - public interface Presenter extends BasePresenter { - void getInstalledApp(); - void getAlarmClock(); - } - - public interface PrecisionView extends BaseView { - void setInstalledApp(ArrayList desktopIcons); - void setAlarmClock(List alarmClockList); - void setAlarmClockEmpty(); - } -} diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java index 8c8f43b..36ca703 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/home/HomeFragment.java @@ -8,47 +8,39 @@ import android.os.Bundle; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; -import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import com.google.gson.Gson; -import com.king.view.circleprogressview.CircleProgressView; -import com.qweather.sdk.bean.base.Code; -import com.qweather.sdk.bean.base.Lang; -import com.qweather.sdk.bean.base.Unit; +import com.jeremyliao.liveeventbus.LiveEventBus; import com.qweather.sdk.bean.weather.WeatherDailyBean; import com.qweather.sdk.bean.weather.WeatherHourlyBean; import com.qweather.sdk.bean.weather.WeatherNowBean; -import com.qweather.sdk.view.QWeather; import com.tencent.mmkv.MMKV; import com.uiuios.aios.BuildConfig; import com.uiuios.aios.R; import com.uiuios.aios.activity.EmergencyActivity; +import com.uiuios.aios.activity.addicon.AddIconActivity; import com.uiuios.aios.activity.alarm.port.PortAlarmActivity; import com.uiuios.aios.activity.contact.ContactActivity; import com.uiuios.aios.activity.weather.WeatherActivity; import com.uiuios.aios.adapter.HomeAppAdapter; import com.uiuios.aios.adapter.NotificationAdapter; import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.alarm.AlarmUtils; -import com.uiuios.aios.base.BaseFragment; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; import com.uiuios.aios.bean.AlarmItem; import com.uiuios.aios.bean.Contact; import com.uiuios.aios.bean.DesktopIcon; +import com.uiuios.aios.bean.MapBean; import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentHomeBinding; import com.uiuios.aios.dialog.SingleDialog; -import com.uiuios.aios.manager.AmapManager; import com.uiuios.aios.manager.RemoteManager; import com.uiuios.aios.network.NetInterfaceManager; import com.uiuios.aios.push.PushManager; @@ -63,62 +55,16 @@ import java.util.Date; import java.util.HashMap; import java.util.List; -import butterknife.BindView; -import butterknife.ButterKnife; - /** * A simple {@link Fragment} subclass. * Use the {@link HomeFragment#newInstance} factory method to * create an instance of this fragment. */ -public class HomeFragment extends BaseFragment implements HomeContact.PrecisionView { +public class HomeFragment extends BaseMvvmFragment { private static final String TAG = HomeFragment.class.getSimpleName(); - @BindView(R.id.cl_weather) - ConstraintLayout cl_weather; - @BindView(R.id.cl_app) - ConstraintLayout cl_app; - @BindView(R.id.cl_space) - ConstraintLayout cl_space; - @BindView(R.id.cl_health) - ConstraintLayout cl_health; - @BindView(R.id.cl_alarmclock) - ConstraintLayout cl_alarmclock; - @BindView(R.id.cl_clear) - ConstraintLayout cl_clear; - @BindView(R.id.cl_sos) - ConstraintLayout cl_sos; - @BindView(R.id.cl_contact) - ConstraintLayout cl_contact; - @BindView(R.id.cl_appstore) - ConstraintLayout cl_appstore; - @BindView(R.id.tv_time) - TextView tv_time; - @BindView(R.id.tv_location) - TextView tv_location; - @BindView(R.id.tv_data) - TextView tv_data; - @BindView(R.id.iv_pic) - ImageView iv_pic; - @BindView(R.id.tv_temp) - TextView tv_temp; - @BindView(R.id.tv_weather) - TextView tv_weather; - @BindView(R.id.cpv) - CircleProgressView cpv; - @BindView(R.id.rv_noti) - RecyclerView rv_noti; - @BindView(R.id.iv_note_nodata) - ImageView iv_note_nodata; - @BindView(R.id.rv_app) - RecyclerView rv_app; - @BindView(R.id.iv_nodata) - ImageView iv_nodata; - - private View rootView; private FragmentActivity mContext; - private HomePresenter mHomePresenter; private HomeAppAdapter mHomeAppAdapter; private List alarmItemList; private NotificationAdapter notificationAdapter; @@ -174,33 +120,121 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - Log.e(TAG, "onCreateView: "); - if (null != rootView) { - ViewGroup parent = (ViewGroup) rootView.getParent(); - if (null != parent) { - parent.removeView(rootView); - } - } else { // 如ongoing果rootView为空 ,就实例化该视图 - rootView = inflater.inflate(R.layout.fragment_home, container, false); - mContext = (FragmentActivity) rootView.getContext(); - mHomePresenter = new HomePresenter(mContext); - mHomePresenter.attachView(this); - mHomePresenter.setLifecycle(getLifecycleSubject()); - ButterKnife.bind(this, rootView); - initView(); + protected int getLayoutId() { + return R.layout.fragment_home; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setCtx(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView(Bundle bundle) { + initView(); + } + + @Override + protected void initData(Bundle savedInstanceState) { + mViewModel.getDesktopIconData().observe(this, new Observer>() { + @Override + public void onChanged(ArrayList desktopIcons) { + Log.e(TAG, "setInstalledApp: " + desktopIcons); + if (desktopIcons == null || desktopIcons.size() == 0) { + mViewDataBinding.ivNodata.setVisibility(View.VISIBLE); + mViewDataBinding.rvApp.setVisibility(View.INVISIBLE); + } else { + mViewDataBinding.ivNodata.setVisibility(View.GONE); + mViewDataBinding.rvApp.setVisibility(View.VISIBLE); + mHomeAppAdapter.setDesktopIcons(desktopIcons); + } + } + }); + + mViewModel.getAlarmClockData().observe(this, new Observer>() { + @Override + public void onChanged(List alarmClockData) { + if (alarmClockData != null && alarmClockData.size() != 0) { + notificationAdapter.setDataList(alarmClockData); + mViewDataBinding.rvNoti.setVisibility(View.VISIBLE); + mViewDataBinding.ivNoteNodata.setVisibility(View.GONE); + } else { + mViewDataBinding.rvNoti.setVisibility(View.GONE); + mViewDataBinding.ivNoteNodata.setVisibility(View.VISIBLE); + } + } + }); + + mViewModel.getActivationData().observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { +// if (aBoolean) { +// mViewDataBinding.clActivation.setVisibility(View.GONE); +// } else { +// mViewDataBinding.clActivation.setVisibility(View.VISIBLE); +// } + } + }); + mViewModel.getNowBaseBeanData().observe(this, new Observer() { + @Override + public void onChanged(WeatherNowBean.NowBaseBean nowBaseBean) { + mViewDataBinding.tvTemp.setText(nowBaseBean.getTemp() + "℃"); + if (isNight()) { + mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_night)); + } else { + switch (nowBaseBean.getIcon()) { + default: + case "100": + case "150": + //晴 + mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather)); + break; + case "102": + case "152": + //少云 + mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_rain)); + break; + } + } +// mViewDataBinding.tvWeather.setText(nowBaseBean.getText()); + } + }); + + mViewModel.getHourlyBeanData().observe(this, new Observer() { + @Override + public void onChanged(WeatherHourlyBean.HourlyBean hourlyBean) { + String imageName = "he" + hourlyBean.getIcon(); + Log.e(TAG, "onSuccess: " + imageName); + if (isAdded()) { + int resId = getResources().getIdentifier(imageName, "drawable", mContext.getPackageName()); + Log.e(TAG, "onSuccess: " + resId); + if (resId == 0) { + mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(R.drawable.he100)); + } else { + mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(resId)); + } + mViewDataBinding.tvTemp.setText(hourlyBean.getTemp() + "℃"); + } + } + }); + + mViewModel.getDailyBeanData().observe(this, new Observer() { + @Override + public void onChanged(WeatherDailyBean.DailyBean dailyBean) { + mViewDataBinding.tvWeather.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); + } + }); - } - return rootView; } private void initView() { initAmap(); setTime(); refreshMemory(); - registerTimeReceiver(); registerAlarmClockReceiver(); @@ -211,16 +245,11 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV getAlarm(); } }); - rv_noti.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - getAlarm(); - } - }); - rv_noti.setLayoutManager(new LinearLayoutManager(mContext)); - rv_noti.setAdapter(notificationAdapter); - rv_app.setLayoutManager(new GridLayoutManager(mContext, 3)); + mViewDataBinding.rvNoti.setLayoutManager(new LinearLayoutManager(mContext)); + mViewDataBinding.rvNoti.setAdapter(notificationAdapter); + + mViewDataBinding.rvApp.setLayoutManager(new GridLayoutManager(mContext, 3)); HashMap stringIntegerHashMap = new HashMap<>(); WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); @@ -230,114 +259,16 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 40));//底部间距 stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 4));//左间距 stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 4));//右间距 - rv_app.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap)); + mViewDataBinding.rvApp.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap)); mHomeAppAdapter = new HomeAppAdapter(); - rv_app.setAdapter(mHomeAppAdapter); - - cl_weather.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startActivity(new Intent(mContext, WeatherActivity.class)); - } - }); - cl_app.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - } - }); - cl_space.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ApkUtils.openPackage(mContext, "com.uiui.videoplayer", "com.uiui.videoplayer.activity.main.MainActivity"); - } - }); - - cl_health.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - } - }); - cl_alarmclock.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - } - }); - cl_clear.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - killBackgroundApp(); - } - }); - cl_sos.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - checkSosNumber(); - } - }); - cl_contact.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startActivity(new Intent(mContext, ContactActivity.class)); - } - }); - cl_appstore.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ApkUtils.openPackage(mContext, "com.uiuios.appstore"); - } - }); - iv_note_nodata.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startActivity(new Intent(mContext, PortAlarmActivity.class)); - } - }); + mViewDataBinding.rvApp.setAdapter(mHomeAppAdapter); } @Override public void onResume() { super.onResume(); Log.e(TAG, "onResume: "); - mHomePresenter.getInstalledApp(); - } - - @Override - public void setInstalledApp(ArrayList desktopIcons) { - Log.e(TAG, "setInstalledApp: " + desktopIcons); - if (desktopIcons == null || desktopIcons.size() == 0) { - iv_nodata.setVisibility(View.VISIBLE); - rv_app.setVisibility(View.INVISIBLE); - } else { - iv_nodata.setVisibility(View.GONE); - rv_app.setVisibility(View.VISIBLE); - mHomeAppAdapter.setDesktopIcons(desktopIcons); - } - mHomePresenter.getAlarmClock(); - } - - @Override - public void setAlarmClock(List alarmClockList) { -// AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); -// List data = new ArrayList<>(); -// if (alarmClockData != null) { -// data.add(alarmClockData); - if (alarmClockList != null) { - notificationAdapter.setDataList(alarmClockList); - rv_noti.setVisibility(View.VISIBLE); - iv_note_nodata.setVisibility(View.GONE); - } else { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } - } - - @Override - public void setAlarmClockEmpty() { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); + mViewModel.init(); } //监听时间和日期变化 @@ -392,7 +323,7 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV new Handler().postDelayed(new Runnable() { @Override public void run() { - mHomePresenter.getAlarmClock(); + mViewModel.getAlarmClock(); } }, 3456); } @@ -466,11 +397,11 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV long total = AppUtil.getTotalMemory(mContext); int x = (int) (((total - avail) / (double) total) * 100); if (x > 80) { - cpv.setProgressColor(mShaderColorsRed); + mViewDataBinding.cpv.setProgressColor(mShaderColorsRed); } else { - cpv.setProgressColor(mShaderColors); + mViewDataBinding.cpv.setProgressColor(mShaderColors); } - cpv.showAnimation(0, x, 1000); + mViewDataBinding.cpv.showAnimation(0, x, 1000); float x2 = (((total - avail) / (float) total)); } @@ -478,10 +409,10 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV long time = System.currentTimeMillis(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); Date date = new Date(time); - tv_time.setText(sdf.format(date)); + mViewDataBinding.tvTime.setText(sdf.format(date)); SimpleDateFormat sdf2 = new SimpleDateFormat("MM月-dd日"); Date date2 = new Date(time); - tv_data.setText(sdf2.format(date2) + "\t" + getWeek()); + mViewDataBinding.tvData.setText(sdf2.format(date2) + "\t" + getWeek()); } /** @@ -500,9 +431,23 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV } private void initAmap() { - String city = AmapManager.getInstance().getCity(); - tv_location.setText(city); - getweather(AmapManager.getInstance().getLocationTude()); + boolean manual = mMMKV.decodeBool(CommonConfig.MANUALLY_SELECT_LOCATION_KEY, false); + String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, CommonConfig.DEFAULT_LOCATION_DISTRICT); + String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, CommonConfig.DEFAULT_LOCATION_TUDE); + mViewDataBinding.tvLocation.setText(district); + mViewModel.getWeather(tude); + if (!manual) { + LiveEventBus.get("MapBean", MapBean.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable MapBean mapBean) { + mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, mapBean.getDistrict()); + mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, mapBean.getLongitude() + "," + mapBean.getLatitude()); + mViewDataBinding.tvLocation.setText(mapBean.getDistrict()); + mViewModel.getWeather(mapBean.getLongitude() + "," + mapBean.getLatitude()); + } + }); + } } @@ -514,147 +459,37 @@ public class HomeFragment extends BaseFragment implements HomeContact.PrecisionV return hour >= 16 && minute >= 30; } - private String nowString; + public class BtnClick { + public void edit(View view) { + startActivity(new Intent(mContext, AddIconActivity.class)); + } - private void getweather(String location) { - Log.e(TAG, "getweather: " + location); - /** - * 实况天气数据 - * @param location 所查询的地区,可通过该地区名称、ID、IP和经纬度进行查询经纬度格式:经度,纬度 - * (英文,分隔,十进制格式,北纬东经为正,南纬西经为负) - * @param lang (选填)多语言,可以不使用该参数,默认为简体中文 - * @param unit (选填)单位选择,公制(m)或英制(i),默认为公制单位 - * @param listener 网络访问结果回调 - */ - QWeather.getWeatherNow(mContext, location, Lang.ZH_HANS, Unit.METRIC, new QWeather.OnResultWeatherNowListener() { - @Override - public void onError(Throwable e) { - Log.e("getWeatherNow", "onError: " + e); - } + public void getAlarmClock(View view) { + getAlarm(); + } - @Override - public void onSuccess(WeatherNowBean weatherBean) { - Log.d("getWeatherNow", "onSuccess: " + new Gson().toJson(weatherBean)); - //先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因 - if (Code.OK == weatherBean.getCode()) { - WeatherNowBean.NowBaseBean now = weatherBean.getNow(); -// String imageName = "he" + now.getIcon(); -// int resId = getResources().getIdentifier(imageName, "drawable", mContext.getPackageName()); -// iv_pic.setImageDrawable(mContext.getDrawable(resId)); - nowString = now.getText(); - tv_temp.setText(now.getTemp() + "℃"); - tv_weather.setText(now.getText()); - String iconDay = weatherBean.getNow().getIcon(); - Log.e("getweather", "onSuccess: iconDay = " + iconDay); - if (isNight()) { - cl_weather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_night)); - } else { - switch (weatherBean.getNow().getIcon()) { - default: - case "100": - case "150": - //晴 - cl_weather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather)); - break; - case "102": - case "152": - //少云 - cl_weather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_rain)); - break; - } - } - } else { - //在此查看返回数据失败的原因 - Code code = weatherBean.getCode(); - Log.d("getWeatherNow", "failed code: " + code); - } - } - }); + public void toWeather(View view) { + startActivity(new Intent(mContext, WeatherActivity.class)); + } - QWeather.getWeather24Hourly(mContext, location, new QWeather.OnResultWeatherHourlyListener() { - @Override - public void onError(Throwable throwable) { - Log.e("getWeather24Hourly", "onError: " + throwable); - } + public void toVideoplayer(View view) { + ApkUtils.openPackage(mContext, "com.uiui.videoplayer", "com.uiui.videoplayer.activity.main.MainActivity"); + } - @Override - public void onSuccess(WeatherHourlyBean weatherHourlyBean) { - Log.d("getWeather24Hourly", "onSuccess: " + new Gson().toJson(weatherHourlyBean)); - if (Code.OK == weatherHourlyBean.getCode()) { - List hourly = weatherHourlyBean.getHourly(); - if (hourly != null && hourly.size() != 0) { - WeatherHourlyBean.HourlyBean now = hourly.get(0); - String imageName = "he" + now.getIcon(); - Log.e(TAG, "onSuccess: " + imageName); - if (isAdded()) { - int resId = getResources().getIdentifier(imageName, "drawable", mContext.getPackageName()); - Log.e(TAG, "onSuccess: " + resId); - if (resId == 0) { - iv_pic.setImageDrawable(mContext.getDrawable(R.drawable.he100)); - } else { - iv_pic.setImageDrawable(mContext.getDrawable(resId)); - } - tv_temp.setText(now.getTemp() + "℃"); - } - } - } else { - //在此查看返回数据失败的原因 - Code code = weatherHourlyBean.getCode(); - Log.e("getWeather24Hourly", "failed code: " + code); - } - } - }); + public void killApp(View view) { + killBackgroundApp(); + } - QWeather.getWeather7D(mContext, location, new QWeather.OnResultWeatherDailyListener() { - @Override - public void onError(Throwable throwable) { - Log.e("getWeather", "onError: " + throwable.getMessage()); + public void toSos(View view) { + checkSosNumber(); + } - } + public void toContact(View view) { + startActivity(new Intent(mContext, ContactActivity.class)); + } - @Override - public void onSuccess(WeatherDailyBean weatherDailyBean) { - String jsonString = new Gson().toJson(weatherDailyBean); - Log.d("getWeather", "onSuccess: " + jsonString); - mMMKV.encode(CommonConfig.WEATHER_DAILY_KEY, jsonString); - List dailyBeans = weatherDailyBean.getDaily(); - if (dailyBeans != null && dailyBeans.size() != 0) { - WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); - tv_weather.setText(nowString + "\t" + dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); - } - } - }); + public void toAppstore(View view) { + ApkUtils.openPackage(mContext, "com.uiuios.appstore"); + } } - - private void getAlarmClock() { - NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() { - @Override - public void setAlarmClock(List alarmClockList) { - AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); - List data = new ArrayList<>(); - if (alarmClockData != null) { - data.add(alarmClockData); - notificationAdapter.setDataList(data); - rv_noti.setVisibility(View.VISIBLE); - iv_note_nodata.setVisibility(View.GONE); - } else { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } - } - - @Override - public void setAlarmClockEmpty() { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } - - @Override - public void onError() { - - } - }); - } - - } diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java deleted file mode 100644 index 6ecf893..0000000 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.uiuios.aios.fragment.home; - -import android.content.Context; - -import com.trello.rxlifecycle4.android.FragmentEvent; -import com.uiuios.aios.R; -import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.bean.DesktopIcon; -import com.uiuios.aios.manager.AppManager; -import com.uiuios.aios.network.NetInterfaceManager; - -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.subjects.BehaviorSubject; - -public class HomePresenter implements HomeContact.Presenter { - private static final String TAG = HomePresenter.class.getSimpleName(); - private Context mContext; - private HomeContact.PrecisionView mView; - - public HomePresenter(Context context) { - this.mContext = context; - } - - private BehaviorSubject lifecycle; - - void setLifecycle(BehaviorSubject lifecycle) { - this.lifecycle = lifecycle; - } - - public BehaviorSubject getLifecycle() { - return lifecycle; - } - - @Override - public void attachView(@NonNull HomeContact.PrecisionView view) { - this.mView = view; - } - - @Override - public void detachView() { - this.mView = null; - } - - - @Override - public void getInstalledApp() { - ArrayList desktopIcons = AppManager.getInstance().getAddDesktopIcon(); -// DesktopIcon updateDesktopIcon = new DesktopIcon(); -// updateDesktopIcon.setLable("应用更新"); -// updateDesktopIcon.setPackageName(AppManager.UPDATE_NAME); -// updateDesktopIcon.setIcon(mContext.getDrawable(R.drawable.icon_update)); -// desktopIcons.add(desktopIcons.size(), updateDesktopIcon); - - DesktopIcon desktopIcon = new DesktopIcon(); - desktopIcon.setTitle("添加应用"); - desktopIcon.setPackage(AppManager.ADD_NAME); - desktopIcon.setIcon(mContext.getDrawable(R.drawable.home_icon_add)); - desktopIcons.add(desktopIcons.size(), desktopIcon); - - mView.setInstalledApp(desktopIcons); - } - - @Override - public void getAlarmClock() { - NetInterfaceManager.getInstance().getAlarmClockFragment(lifecycle, new NetInterfaceManager.AlarmClockCallback() { - @Override - public void setAlarmClock(List alarmClockList) { - mView.setAlarmClock(alarmClockList); - } - - @Override - public void setAlarmClockEmpty() { - mView.setAlarmClockEmpty(); - } - - @Override - public void onError() { - - } - }); - } -} diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomeViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomeViewModel.java new file mode 100644 index 0000000..6b75405 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/home/HomeViewModel.java @@ -0,0 +1,225 @@ +package com.uiuios.aios.fragment.home; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.hjq.toast.Toaster; +import com.qweather.sdk.bean.base.Code; +import com.qweather.sdk.bean.base.Lang; +import com.qweather.sdk.bean.base.Unit; +import com.qweather.sdk.bean.weather.WeatherDailyBean; +import com.qweather.sdk.bean.weather.WeatherHourlyBean; +import com.qweather.sdk.bean.weather.WeatherNowBean; +import com.qweather.sdk.view.QWeather; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.alarm.AlarmClockData; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.DesktopIcon; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentHomeBinding; +import com.uiuios.aios.manager.AppManager; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.utils.ActivationUtil; + +import java.util.ArrayList; +import java.util.List; + +public class HomeViewModel extends BaseViewModel { + private static final String TAG = HomeViewModel.class.getSimpleName(); + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + + @Override + public FragmentHomeBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + public void init() { + getInstalledApp(); + getAlarmClock(); + } + + private MutableLiveData> DesktopIconData = new MutableLiveData<>(); + + public MutableLiveData> getDesktopIconData() { + return DesktopIconData; + } + + public void getInstalledApp() { + ArrayList desktopIcons = AppManager.getInstance().getAddDesktopIcon(); +// DesktopIcon updateDesktopIcon = new DesktopIcon(); +// updateDesktopIcon.setLable("应用更新"); +// updateDesktopIcon.setPackageName(AppManager.UPDATE_NAME); +// updateDesktopIcon.setIcon(mContext.getDrawable(R.drawable.icon_update)); +// desktopIcons.add(desktopIcons.size(), updateDesktopIcon); + + if (desktopIcons.size()!=6){ + DesktopIcon desktopIcon = new DesktopIcon(); + desktopIcon.setTitle("添加应用"); + desktopIcon.setPackage(AppManager.ADD_NAME); +// desktopIcon.setIcon(mContext.getDrawable(R.drawable.home_icon_add)); + desktopIcons.add(desktopIcons.size(), desktopIcon); + } + + DesktopIconData.setValue(desktopIcons); + } + + private MutableLiveData> mAlarmClockData = new MutableLiveData<>(); + + public MutableLiveData> getAlarmClockData() { + return mAlarmClockData; + } + + public void getAlarmClock() { + NetInterfaceManager.getInstance().getAlarmClockFragment(getLifecycle(), new NetInterfaceManager.AlarmClockCallback() { + @Override + public void setAlarmClock(List alarmClockList) { + mAlarmClockData.setValue(alarmClockList); + } + + @Override + public void setAlarmClockEmpty() { + mAlarmClockData.setValue(new ArrayList<>()); + } + + @Override + public void onError() { + + } + }); + } + + + private MutableLiveData activationData = new MutableLiveData<>(); + + public MutableLiveData getActivationData() { + return activationData; + } + + public void getSnIsActivation() { + boolean activation = ActivationUtil.isActivation(getCtx()); + Log.e(TAG, "getSnIsActivation: is_activation = " + activation); + activationData.setValue(activation); + } + + public void getWeather(String location) { + Log.e(TAG, "getweather: " + location); + boolean activation = ActivationUtil.isActivation(getCtx()); + Log.e(TAG, "getweather: is_activation = " + activation); + if (!activation) { + Toaster.show("请先激活设备"); + return; + } + getWeatherNow(location); + getWeather24Hourly(location); + getWeather7D(location); + } + + private MutableLiveData mNowBaseBeanData = new MutableLiveData<>(); + + public MutableLiveData getNowBaseBeanData() { + return mNowBaseBeanData; + } + + public void getWeatherNow(String location) { + Log.e(TAG, "getWeatherNow: " + location); + /** + * 实况天气数据 + * @param location 所查询的地区,可通过该地区名称、ID、IP和经纬度进行查询经纬度格式:经度,纬度 + * (英文,分隔,十进制格式,北纬东经为正,南纬西经为负) + * @param lang (选填)多语言,可以不使用该参数,默认为简体中文 + * @param unit (选填)单位选择,公制(m)或英制(i),默认为公制单位 + * @param listener 网络访问结果回调 + */ + QWeather.getWeatherNow(getCtx(), location, Lang.ZH_HANS, Unit.METRIC, new QWeather.OnResultWeatherNowListener() { + @Override + public void onError(Throwable e) { + Log.e("getWeatherNow", "onError: " + e); + } + + @Override + public void onSuccess(WeatherNowBean weatherBean) { + Log.d("getWeatherNow", "onSuccess: " + new Gson().toJson(weatherBean)); + //先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因 + if (Code.OK == weatherBean.getCode()) { + WeatherNowBean.NowBaseBean now = weatherBean.getNow(); + mNowBaseBeanData.postValue(now); + Log.d("getWeatherNow", "onSuccess: now " + new Gson().toJson(now)); + } else { + //在此查看返回数据失败的原因 + Code code = weatherBean.getCode(); + Log.d("getWeatherNow", "failed code: " + code); + } + } + }); + } + + private MutableLiveData mHourlyBeanData = new MutableLiveData<>(); + + public MutableLiveData getHourlyBeanData() { + return mHourlyBeanData; + } + + public void getWeather24Hourly(String location) { + QWeather.getWeather24Hourly(getCtx(), location, new QWeather.OnResultWeatherHourlyListener() { + @Override + public void onError(Throwable throwable) { + Log.e("getWeather24Hourly", "onError: " + throwable); + } + + @Override + public void onSuccess(WeatherHourlyBean weatherHourlyBean) { + Log.d("getWeather24Hourly", "onSuccess: " + new Gson().toJson(weatherHourlyBean)); + if (Code.OK == weatherHourlyBean.getCode()) { + List hourly = weatherHourlyBean.getHourly(); + if (hourly != null && hourly.size() != 0) { + WeatherHourlyBean.HourlyBean now = hourly.get(0); + mHourlyBeanData.postValue(now); + } + } else { + //在此查看返回数据失败的原因 + Code code = weatherHourlyBean.getCode(); + Log.e("getWeather24Hourly", "failed code: " + code); + } + } + }); + } + + private MutableLiveData DailyBeanData = new MutableLiveData<>(); + + public MutableLiveData getDailyBeanData() { + return DailyBeanData; + } + + public void getWeather7D(String location) { + QWeather.getWeather7D(getCtx(), location, new QWeather.OnResultWeatherDailyListener() { + @Override + public void onError(Throwable throwable) { + Log.e("getWeather7D", "onError: " + throwable.getMessage()); + + } + + @Override + public void onSuccess(WeatherDailyBean weatherDailyBean) { + String jsonString = new Gson().toJson(weatherDailyBean); + Log.d("getWeather7D", "onSuccess: " + jsonString); + mMMKV.encode(CommonConfig.WEATHER_DAILY_KEY, jsonString); + List dailyBeans = weatherDailyBean.getDaily(); + if (dailyBeans != null && dailyBeans.size() != 0) { + WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); + DailyBeanData.postValue(dailyBean); + } + } + }); + } + +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactFragment.java b/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactFragment.java new file mode 100644 index 0000000..ebe9a22 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactFragment.java @@ -0,0 +1,122 @@ +package com.uiuios.aios.fragment.phone.contact; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.uiuios.aios.R; +import com.uiuios.aios.activity.contact.AddContactActivity; +import com.uiuios.aios.adapter.ContactAdapter; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.databinding.FragmentContactBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * A simple {@link BaseMvvmFragment} subclass. + * Use the {@link ContactFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class ContactFragment extends BaseMvvmFragment { + private static final String TAG = ContactFragment.class.getSimpleName(); + + private Context mContext; + private ContactAdapter mContactAdapter; + + public ContactFragment() { + + } + + public static ContactFragment newInstance() { + ContactFragment fragment = new ContactFragment(); + return fragment; + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_contact; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setCtx(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + } + + @Override + protected void initView(Bundle bundle) { + mContactAdapter = new ContactAdapter(); + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(mContext, 3)); + } else { + mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(mContext, 2)); + } + mViewDataBinding.rvContact.setAdapter(mContactAdapter); + mViewDataBinding.tvAdd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(mContext, AddContactActivity.class); + startActivity(intent); + } + }); + mViewModel.getContactListData().observe(this, new Observer>() { + @Override + public void onChanged(List contacts) { + List sim = getSIMContacts(); + mViewDataBinding.tvPeople.setText(contacts.size() + "人"); + if (sim.size() != 0) { + contacts.addAll(sim); + } + mContactAdapter.setContactList(contacts); + } + }); + } + + @Override + protected void initData(Bundle savedInstanceState) { + mViewModel.getContact(); + } + + @Override + public void fetchData() { + + } + + public static final String NAME = "name"; + public static final String NUMBER = "number"; + + private List getSIMContacts() { + List contactList = new ArrayList<>(); + ContentResolver resolver = mContext.getContentResolver(); + // 获取Sims卡联系人 + Uri uri = Uri.parse("content://icc/adn"); + Cursor phoneCursor = resolver.query(uri, null, null, null, null); + if (phoneCursor != null) { + final int colName = phoneCursor.getColumnIndex(NAME); + final int colNumber = phoneCursor.getColumnIndex(NUMBER); + while (phoneCursor.moveToNext()) { + String number = phoneCursor.getString(colNumber); + // 当手机号码为空的或者为空字段 跳过当前循环 + String username = phoneCursor.getString(colName); + Log.e(TAG, "getSIMContacts: number = " + number + " username = " + username); + Contact contact = new Contact(username, number, true); + contactList.add(contact); + } + phoneCursor.close(); + } + return contactList; + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactViewModel.java new file mode 100644 index 0000000..9a9ec4e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/contact/ContactViewModel.java @@ -0,0 +1,92 @@ +package com.uiuios.aios.fragment.phone.contact; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentContactBinding; +import com.uiuios.aios.gson.GsonUtils; +import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.network.UrlAddress; + +import java.lang.reflect.Type; +import java.util.List; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class ContactViewModel extends BaseViewModel { + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + @Override + public FragmentContactBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mContactListData = new MutableLiveData<>(); + + public MutableLiveData> getContactListData() { + return mContactListData; + } + + public void getContact() { + NetInterfaceManager.getInstance() + .getContactListObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getContactList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getContactList", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(listBaseResponse.data)); + mContactListData.setValue(listBaseResponse.data); + } else { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); +// mContactListData.setValue(null); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getContactList", "onError: " + e.getMessage()); + String jsonString = mMMKV.getString(UrlAddress.GET_MAIL_LIST, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List contacts = gson.fromJson(jsonString, type); + if (contacts == null) { +// mContactListData.setValue(null); + } else { + mContactListData.setValue(contacts); + } + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getContactList", "onComplete: "); + } + }); + } + +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerFragment.java b/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerFragment.java new file mode 100644 index 0000000..c1ceaf1 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerFragment.java @@ -0,0 +1,176 @@ +package com.uiuios.aios.fragment.phone.dialer; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import com.hjq.toast.Toaster; +import com.uiuios.aios.R; +import com.uiuios.aios.activity.SelectNumberActivity; +import com.uiuios.aios.activity.contact.ContactActivity; +import com.uiuios.aios.activity.records.RecordsActivity; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; +import com.uiuios.aios.databinding.FragmentDialerBinding; +import com.uiuios.aios.utils.Utils; + +/** + * A simple {@link BaseMvvmFragment} subclass. + * Use the {@link DialerFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class DialerFragment extends BaseMvvmFragment { + private static final String TAG = DialerFragment.class.getSimpleName(); + + private Context mContext; + + + public DialerFragment() { + + } + + public static DialerFragment newInstance(String param1, String param2) { + DialerFragment fragment = new DialerFragment(); + return fragment; + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_dialer; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setCtx(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView(Bundle bundle) { + + } + + @Override + protected void initData(Bundle savedInstanceState) { + + } + + @Override + public void fetchData() { + + } + + private void callNumber() { + String phone = mViewDataBinding.etPhone.getText().toString(); + if (TextUtils.isEmpty(phone)) { + Toaster.show("请输入号码"); + } else { + if (Utils.isMultiSim(mContext)) { + startActivity(new Intent(mContext, SelectNumberActivity.class)); + } else { + try { + Intent dialIntent = new Intent(Intent.ACTION_CALL); + Uri data = Uri.parse("tel:" + phone); + dialIntent.setData(data); + startActivity(dialIntent); + } catch (Exception e) { + Log.e(TAG, "callNumber: " + e.getMessage()); + } + } + } + } + + private void addNumber(String number, int position) { + String tmp = mViewDataBinding.etPhone.getText().toString(); + if (TextUtils.isEmpty(tmp)) { + mViewDataBinding.etPhone.setText(number); + } else { + mViewDataBinding.etPhone.setText(tmp + number); + } +// soundPool.play(soundMap.get(position), 1, 1, 0, 0, 1); + } + + public class BtnClick { + public void number0(View view) { + addNumber("0", 0); + } + + public void number1(View view) { + addNumber("1", 1); + } + + public void number2(View view) { + addNumber("2", 2); + } + + public void number3(View view) { + addNumber("3", 3); + } + + public void number4(View view) { + addNumber("4", 4); + } + + public void number5(View view) { + addNumber("5", 5); + } + + public void number6(View view) { + addNumber("6", 6); + } + + public void number7(View view) { + addNumber("7", 7); + } + + public void number8(View view) { + addNumber("8", 8); + } + + public void number9(View view) { + addNumber("9", 9); + } + + public void numberStar(View view) { + addNumber("*", 10); + } + + public void numberSharp(View view) { + addNumber("#", 11); + } + + public void call(View view) { + if (Utils.hasSimCard(mContext)) { + callNumber(); + } else { + Toaster.show("请插入SIM卡"); + } + } + + public void backSpace(View view) { + String tmp = mViewDataBinding.etPhone.getText().toString(); + if (TextUtils.isEmpty(tmp)) { + mViewDataBinding.etPhone.setText(""); + } else { + mViewDataBinding.etPhone.setText(tmp.substring(0, tmp.length() - 1)); + } + } + + public void toContact(View view) { + Intent intent = new Intent(mContext, ContactActivity.class); + startActivity(intent); + } + + public void toRecord(View view) { + Intent intent = new Intent(mContext, RecordsActivity.class); + startActivity(intent); + } + } + +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerViewModel.java new file mode 100644 index 0000000..708897a --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/dialer/DialerViewModel.java @@ -0,0 +1,20 @@ +package com.uiuios.aios.fragment.phone.dialer; + +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.databinding.FragmentDialerBinding; + +public class DialerViewModel extends BaseViewModel { + @Override + public FragmentDialerBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + + +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordFragment.java b/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordFragment.java new file mode 100644 index 0000000..8285394 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordFragment.java @@ -0,0 +1,172 @@ +package com.uiuios.aios.fragment.phone.record; + +import android.content.Context; +import android.os.Bundle; +import android.provider.CallLog; +import android.util.Log; +import android.view.View; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; + + +import com.uiuios.aios.R; +import com.uiuios.aios.adapter.CallRecordAdapter; +import com.uiuios.aios.base.mvvm.fragment.BaseMvvmFragment; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.bean.RecordsInfo; +import com.uiuios.aios.databinding.FragmentRecordBinding; +import com.uiuios.aios.dialog.DeleteDialog; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link RecordFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class RecordFragment extends BaseMvvmFragment { + private static final String TAG = RecordFragment.class.getSimpleName(); + + + private Context mContext; + private CallRecordAdapter mCallRecordAdapter; + private List dataList = new ArrayList<>(); + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + public RecordFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment RecordFragment. + */ + // TODO: Rename and change types and number of parameters + public static RecordFragment newInstance(String param1, String param2) { + RecordFragment fragment = new RecordFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_record; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setCtx(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + } + + @Override + protected void initView(Bundle bundle) { + mCallRecordAdapter = new CallRecordAdapter(); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + mViewDataBinding.recyclerView.setLayoutManager(linearLayoutManager); + mViewDataBinding.recyclerView.setAdapter(mCallRecordAdapter); + + mViewDataBinding.ivClear.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + showDialog(); + } + }); + } + + @Override + protected void initData(Bundle savedInstanceState) { + mViewModel.getRecordsInfoData().observe(this, new Observer>() { + @Override + public void onChanged(List recordsInfos) { + dataList = recordsInfos; + if (dataList.size() == 0) { + mViewDataBinding.tvNodata.setVisibility(View.VISIBLE); + mViewDataBinding.recyclerView.setVisibility(View.GONE); + } else { + mViewDataBinding.tvNodata.setVisibility(View.GONE); + mViewDataBinding.recyclerView.setVisibility(View.VISIBLE); + } + mCallRecordAdapter.setRecordsInfoList(dataList); + } + }); + mViewModel.getContactMapData().observe(this, new Observer>() { + @Override + public void onChanged(Map stringContactMap) { + mCallRecordAdapter.setContactMap(stringContactMap); + } + }); + mViewModel.getContact(); + mViewModel.getRecordsInfoList(); + } + + @Override + public void fetchData() { + Log.e(TAG, "fetchData: "); + mViewModel.getRecordsInfoList(); + } + + @Override + public void onResume() { + super.onResume(); + Log.e(TAG, "onResume: "); + mViewModel.getRecordsInfoList(); + } + + private void showDialog() { + DeleteDialog dialog = new DeleteDialog(mContext); + dialog.setTitle("提醒") + .setMessage("清空全部通话记录") + .setPositive("确定") + .setNegtive("取消") +// .setSingle(true) + .setOnClickBottomListener(new DeleteDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + for (RecordsInfo recordsInfo : dataList) { + String queryString = "NUMBER=" + recordsInfo.getNumber(); + mContext.getContentResolver().delete(CallLog.Calls.CONTENT_URI, queryString, null); + } + mViewModel.getRecordsInfoList(); + dialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); + dialog.show(); + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordViewModel.java b/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordViewModel.java new file mode 100644 index 0000000..1c91aa8 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/fragment/phone/record/RecordViewModel.java @@ -0,0 +1,145 @@ +package com.uiuios.aios.fragment.phone.record; + +import android.content.ContentResolver; +import android.database.Cursor; +import android.provider.CallLog; +import android.text.TextUtils; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiuios.aios.base.mvvm.BaseViewModel; +import com.uiuios.aios.bean.Contact; +import com.uiuios.aios.bean.RecordsInfo; +import com.uiuios.aios.config.CommonConfig; +import com.uiuios.aios.databinding.FragmentRecordBinding; +import com.uiuios.aios.network.UrlAddress; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class RecordViewModel extends BaseViewModel { + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + + @Override + public FragmentRecordBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + + private MutableLiveData> mRecordsInfoData = new MutableLiveData<>(); + + public MutableLiveData> getRecordsInfoData() { + return mRecordsInfoData; + } + + /** + * 读取数据 + * + * @return 读取到的数据 + */ + public void getRecordsInfoList() { + if (getCtx() == null) { + return; + } + // 1.获得ContentResolver + ContentResolver resolver = getCtx().getContentResolver(); + // 2.利用ContentResolver的query方法查询通话记录数据库 + /** + * @param uri 需要查询的URI,(这个URI是ContentProvider提供的) + * @param projection 需要查询的字段 + * @param selection sql语句where之后的语句 + * @param selectionArgs ?占位符代表的数据 + * @param sortOrder 排序方式 + * + */ + Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, // 查询通话记录的URI + new String[]{CallLog.Calls.CACHED_NAME// 通话记录的联系人 + , CallLog.Calls.NUMBER// 通话记录的电话号码 + , CallLog.Calls.DATE// 通话记录的日期 + , CallLog.Calls.DURATION// 通话时长 + , CallLog.Calls.TYPE}// 通话类型 + , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示 + ); + // 3.通过Cursor获得数据 + List list = new ArrayList<>(); + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); + String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); + long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); +// String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date(dateLong)); + int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION)); + int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); + + RecordsInfo recordsInfo = new RecordsInfo(); + recordsInfo.setName(name); + recordsInfo.setNumber(number); + recordsInfo.setDate(dateLong); + recordsInfo.setDuration(duration); + recordsInfo.setType(type); + list.add(recordsInfo); + + String typeString = ""; + switch (type) { + case CallLog.Calls.INCOMING_TYPE: + typeString = "打入"; + break; + case CallLog.Calls.OUTGOING_TYPE: + typeString = "打出"; + break; + case CallLog.Calls.MISSED_TYPE: + typeString = "未接"; + break; + default: + break; + } + } + + mRecordsInfoData.setValue(list); + } + + private MutableLiveData> mContactMapData = new MutableLiveData(); + + public MutableLiveData> getContactMapData() { + return mContactMapData; + } + + public void getContact() { + String jsonString = mMMKV.decodeString(UrlAddress.GET_MAIL_LIST); + if (!TextUtils.isEmpty(jsonString)) { + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List contactList = gson.fromJson(jsonString, type); + if (contactList != null) { + Map map = contactList.stream().collect(Collectors.toMap(new Function() { + @Override + public String apply(Contact contact) { + return contact.getMobile(); + } + }, new Function() { + @Override + public Contact apply(Contact contact) { + return contact; + } + })); + mContactMapData.setValue(map); + } + } + + } +} diff --git a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java index 2b8e532..043da68 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java @@ -321,7 +321,7 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, try { Intent intent = new Intent(Intent.ACTION_MAIN); /*知道要跳转应用的包命与目标Activity*/ - ComponentName componentName = new ComponentName("com.uiui.city", "com.uiui.city.activity.MainActivity"); + ComponentName componentName = new ComponentName("com.uiui.city", "com.uiui.city.activity.OldMainActivity"); intent.putExtra("position", position); intent.setComponent(componentName); intent.putExtra("", "");//这里Intent传值 diff --git a/app/src/main/java/com/uiuios/aios/manager/AmapManager.java b/app/src/main/java/com/uiuios/aios/manager/AmapManager.java index 53f81fb..3eaafa7 100644 --- a/app/src/main/java/com/uiuios/aios/manager/AmapManager.java +++ b/app/src/main/java/com/uiuios/aios/manager/AmapManager.java @@ -18,6 +18,7 @@ import com.uiuios.aios.bean.MapBean; import com.uiuios.aios.config.CommonConfig; import com.uiuios.aios.gson.GsonUtils; import com.uiuios.aios.network.NetInterfaceManager; +import com.uiuios.aios.utils.ActivationUtil; import java.lang.reflect.Type; @@ -103,6 +104,11 @@ public class AmapManager { } public void startLocation() { + boolean activation = ActivationUtil.isActivation(mContext); + if (!activation) { + Log.e(TAG, "startLocation: 未激活" ); + return; + } mAMapLocationClient.stopLocation(); mAMapLocationClient.startLocation(); Log.e(TAG, "initAmap: " + "startLocation"); diff --git a/app/src/main/java/com/uiuios/aios/manager/AppStatusManager.java b/app/src/main/java/com/uiuios/aios/manager/AppStatusManager.java index 75813ad..cdce3c3 100644 --- a/app/src/main/java/com/uiuios/aios/manager/AppStatusManager.java +++ b/app/src/main/java/com/uiuios/aios/manager/AppStatusManager.java @@ -8,15 +8,15 @@ import android.content.pm.ResolveInfo; import android.util.Log; import com.tencent.mmkv.MMKV; -import com.uiuios.aios.activity.main.MainActivity; +import com.uiuios.aios.activity.main.OldMainActivity; import com.uiuios.aios.bean.DailyAppBean; import com.uiuios.aios.config.CommonConfig; -import com.uiuios.aios.utils.IconUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Predicate; public class AppStatusManager { private static final String TAG = AppStatusManager.class.getSimpleName(); @@ -66,13 +66,13 @@ public class AppStatusManager { public void addHidedApp(String pkg) { this.hidedAppSet.add(pkg); mMMKV.encode(APP_STATUS_MANAGER_KEY, hidedAppSet); - mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); + mContext.sendBroadcast(new Intent(OldMainActivity.ACTION_PACKAGE_HIDE)); } public void removeHidedApp(String pkg) { this.hidedAppSet.remove(pkg); mMMKV.encode(APP_STATUS_MANAGER_KEY, hidedAppSet); - mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); + mContext.sendBroadcast(new Intent(OldMainActivity.ACTION_PACKAGE_HIDE)); } public List getPackageList() { @@ -83,26 +83,34 @@ public class AppStatusManager { resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0); - for (ResolveInfo packageInfo : resolveinfoList) { String pkg = packageInfo.activityInfo.packageName; if (hidedAppSet.contains(pkg)) { Log.e(TAG, "getPackageList: " + pkg); DailyAppBean appSelectBean = new DailyAppBean(packageInfo.activityInfo.loadLabel(pm).toString(), packageInfo.activityInfo.packageName, - packageInfo.activityInfo.name, - packageInfo.activityInfo.loadIcon(pm)); - int i = IconUtils.appClassNameList.indexOf(pkg); - if (i != -1) { - String val = IconUtils.appIconList.get(i); - int resID = mContext.getResources().getIdentifier(val, "drawable", "com.uiuios.aios"); - if (resID != 0) { - appSelectBean.setIcon(mContext.getResources().getDrawable(resID)); - } - } + packageInfo.activityInfo.name + ); + dailyAppBeanList.add(appSelectBean); } } return dailyAppBeanList; } + + public long getPackageListSize() { + PackageManager pm = mContext.getPackageManager(); + List dailyAppBeanList = new ArrayList<>(); + // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent + Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); + resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); + // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName + List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0); + return resolveinfoList.stream().filter(new Predicate() { + @Override + public boolean test(ResolveInfo resolveInfo) { + return hidedAppSet.contains(resolveInfo.activityInfo.packageName); + } + }).count(); + } } diff --git a/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java b/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java index a125a86..6156c25 100644 --- a/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java +++ b/app/src/main/java/com/uiuios/aios/manager/RemoteManager.java @@ -11,6 +11,7 @@ import android.util.Log; import com.tencent.bugly.crashreport.CrashReport; import com.tencent.mmkv.MMKV; +import com.uiuios.aios.BuildConfig; import com.uiuios.aios.config.CommonConfig; import com.uiuios.aios.disklrucache.CacheHelper; import com.uiuios.sn.IGetInfoInterface; @@ -118,7 +119,7 @@ public class RemoteManager { * @return 获取sn */ public String getSerial() { -// if (BuildConfig.DEBUG) return "MTK0002306120556370"; +// if (BuildConfig.DEBUG) return "MTK13220282310"; if (mIGetInfoInterface != null) { try { return mIGetInfoInterface.getSerial(); diff --git a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java index 51a3874..aef962e 100644 --- a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java +++ b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java @@ -17,22 +17,20 @@ public class ShortcutPkgInfo extends DesktopIcon implements Serializable { } - public ShortcutPkgInfo(String id, String title, String packageName, ComponentName componentName, Drawable icon) { + public ShortcutPkgInfo(String id, String title, String packageName, ComponentName componentName) { mId = id; mTitle = title; mPackageName = packageName; mClass = componentName.getClassName(); mPackage = componentName.getPackageName(); - this.icon = icon; } - public ShortcutPkgInfo(String id, String title, String packageName, String aClass, String aPackage, Drawable icon) { + public ShortcutPkgInfo(String id, String title, String packageName, String aClass, String aPackage) { mId = id; mTitle = title; mPackageName = packageName; mClass = aClass; mPackage = aPackage; - this.icon = icon; } public String getId() { diff --git a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java index 35008ec..bf2bf85 100644 --- a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java +++ b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java @@ -102,7 +102,7 @@ public class ShortcutUtils { shortcutPkgInfo.setPackageName(cursor.getString(2)); shortcutPkgInfo.setClass(cursor.getString(3)); shortcutPkgInfo.setPackage(cursor.getString(4)); - shortcutPkgInfo.setIcon(Bytes2Drawable(cursor.getBlob(5))); +// shortcutPkgInfo.setIcon(Bytes2Drawable(cursor.getBlob(5))); list.add(shortcutPkgInfo); } while (cursor.moveToNext()); } @@ -117,7 +117,7 @@ public class ShortcutUtils { values.put(ShortcutHelper.KEY_PACKAGENAME, shortcutPkgInfo.getPackageName()); values.put(ShortcutHelper.KEY_CLASS, shortcutPkgInfo.getClazz()); values.put(ShortcutHelper.KEY_PACKAGE, shortcutPkgInfo.getPackage()); - values.put(ShortcutHelper.KEY_ICON, drawableToBitmap(shortcutPkgInfo.getIcon())); + values.put(ShortcutHelper.KEY_ICON, drawableToBitmap(shortcutPkgInfo.getIcon(mContext))); values.put(ShortcutHelper.KEY_TIMESTAMP, System.currentTimeMillis()); return values; } diff --git a/app/src/main/java/com/uiuios/aios/utils/ActivationUtil.java b/app/src/main/java/com/uiuios/aios/utils/ActivationUtil.java new file mode 100644 index 0000000..2eee18e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/utils/ActivationUtil.java @@ -0,0 +1,91 @@ +package com.uiuios.aios.utils; + +import android.content.Context; +import android.provider.Settings; + +import com.uiuios.aios.config.CommonConfig; + +public class ActivationUtil { + + /*写入1为激活*/ + private static final int ACTIVATED_KEY = 1; + private static final int INACTIVATED_KEY = 0; + /*默认激活码类型*/ + private static final int DEFAULT_CODE_TYPE = -1; + /*默认过期时间*/ + private static final int DEFAULT_EXPIRE_TIME = -1; + + + /** + * 获取激活状态 + * + * @param context + * @return + */ + public static int getActivationStateCode(Context context) { + int activation = Settings.Global.getInt(context.getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, INACTIVATED_KEY); + return activation; + } + + /** + * 是否激活 + * + * @param context + * @return + */ + public static boolean isActivation(Context context) { + if (context == null) return false; + return getActivationStateCode(context) == ACTIVATED_KEY; + } + + /** + * 设置激活状态 + * + * @param context + * @param code + */ + public static void setActivation(Context context, int code) { + Settings.Global.putInt(context.getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, code); + } + + /** + * 设置激活码类型 + * + * @param context + * @param code + */ + public static void setActivationCodeType(Context context, int code) { + Settings.Global.putInt(context.getContentResolver(), CommonConfig.UIUI_CODE_TYPE_KEY, code); + } + + /** + * 获取激活码类型 + * + * @param context + * @return + */ + public static int getActivationCodeType(Context context) { + return Settings.Global.getInt(context.getContentResolver(), CommonConfig.UIUI_CODE_TYPE_KEY, DEFAULT_CODE_TYPE); + } + + /** + * 设置过期时间 + * + * @param context + * @param expireTime + */ + public static void setActivationExpireTime(Context context, long expireTime) { + Settings.Global.putLong(context.getContentResolver(), CommonConfig.UIUI_EXPIRE_TIME_KEY, expireTime); + } + + /** + * 获取过期时间 + * + * @param context + * @return + */ + public static long getActivationExpireTime(Context context) { + return Settings.Global.getLong(context.getContentResolver(), CommonConfig.UIUI_EXPIRE_TIME_KEY, DEFAULT_EXPIRE_TIME); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java b/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java index c863c11..abe06f3 100644 --- a/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java @@ -287,13 +287,13 @@ public class ApkUtils { desktopIcons.addAll(shortcutPkgInfos); DesktopIcon dailyIcon = new DesktopIcon(); - dailyIcon.setIcon(context.getDrawable(R.drawable.icon_daily_app)); +// dailyIcon.setIcon(context.getDrawable(R.drawable.icon_daily_app)); dailyIcon.setTitle("日常应用"); dailyIcon.setPackage("aios.daily.app"); desktopIcons.add(0, dailyIcon); DesktopIcon familyIcon = new DesktopIcon(); - familyIcon.setIcon(context.getDrawable(R.drawable.com_android_appstore)); +// familyIcon.setIcon(context.getDrawable(R.drawable.com_android_appstore)); familyIcon.setTitle("应用市场"); familyIcon.setPackage("aios.appstore"); desktopIcons.add(1, familyIcon); diff --git a/app/src/main/java/com/uiuios/aios/utils/Utils.java b/app/src/main/java/com/uiuios/aios/utils/Utils.java index 1ea8927..b3eebbc 100644 --- a/app/src/main/java/com/uiuios/aios/utils/Utils.java +++ b/app/src/main/java/com/uiuios/aios/utils/Utils.java @@ -16,10 +16,14 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; +import android.net.Uri; import android.os.BatteryManager; import android.os.Build; import android.os.Environment; import android.os.UserHandle; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -140,7 +144,7 @@ public class Utils { //爱华定制 intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.AoleReceiver")); // TODO: 2022/7/6 有问题 - setDefaultLauncher(context, "com.android.transfer", "com.android.transfer.MainActivity"); + setDefaultLauncher(context, "com.android.transfer", "com.android.transfer.OldMainActivity"); // SystemProperties.set("persist.sys.launcher.pkgname", pkg); // SystemProperties.set("persist.sys.launcher.classname", className); // } @@ -298,4 +302,48 @@ public class Utils { return result; } + /** + * 判断是否包含SIM卡 + * + * @return 状态 + */ + public static boolean hasSimCard(Context context) { + TelephonyManager telMgr = (TelephonyManager) + context.getSystemService(Context.TELEPHONY_SERVICE); + int simState = telMgr.getSimState(); + boolean result = true; + switch (simState) { + case TelephonyManager.SIM_STATE_ABSENT: + result = false; // 没有SIM卡 + break; + case TelephonyManager.SIM_STATE_UNKNOWN: + result = false; + break; + } + Log.d("try", result ? "有SIM卡" : "无SIM卡"); + return result; + } + + public static boolean isMultiSim(Context context){ + boolean result = false; + TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); + if(telecomManager != null){ + List phoneAccountHandleList = telecomManager.getCallCapablePhoneAccounts(); + result = phoneAccountHandleList.size() >= 2; + } + return result; + } + + public static void call(Context context, int id, String telNum){ + TelecomManager telecomManager = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); + if(telecomManager != null){ + List phoneAccountHandleList = telecomManager.getCallCapablePhoneAccounts(); + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_CALL); + intent.setData(Uri.parse("tel:" + telNum)); + intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandleList.get(id)); + context.startActivity(intent); + } + } + } diff --git a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomPagerAdapter.java b/app/src/main/java/com/uiuios/aios/view/CustomPagerAdapter.java similarity index 94% rename from app/src/main/java/com/uiuios/aios/fragment/custom/CustomPagerAdapter.java rename to app/src/main/java/com/uiuios/aios/view/CustomPagerAdapter.java index 8237952..428024e 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/custom/CustomPagerAdapter.java +++ b/app/src/main/java/com/uiuios/aios/view/CustomPagerAdapter.java @@ -1,4 +1,4 @@ -package com.uiuios.aios.fragment.custom; +package com.uiuios.aios.view; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; diff --git a/app/src/main/java/com/uiuios/aios/fragment/ViewPager2Adapter.java b/app/src/main/java/com/uiuios/aios/view/ViewPager2Adapter.java similarity index 99% rename from app/src/main/java/com/uiuios/aios/fragment/ViewPager2Adapter.java rename to app/src/main/java/com/uiuios/aios/view/ViewPager2Adapter.java index 3e67885..149d0da 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/ViewPager2Adapter.java +++ b/app/src/main/java/com/uiuios/aios/view/ViewPager2Adapter.java @@ -1,4 +1,4 @@ -package com.uiuios.aios.fragment; +package com.uiuios.aios.view; import android.util.SparseArray; diff --git a/app/src/main/res/drawable-hdpi/android_icon_sos.png b/app/src/main/res/drawable-hdpi/android_icon_sos.png new file mode 100644 index 0000000..bd7d41f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/android_icon_sos.png differ diff --git a/app/src/main/res/drawable-hdpi/bg_aero.png b/app/src/main/res/drawable-hdpi/bg_aero.png new file mode 100644 index 0000000..ef06c02 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/bg_aero.png differ diff --git a/app/src/main/res/drawable-hdpi/dialer_call.png b/app/src/main/res/drawable-hdpi/dialer_call.png new file mode 100644 index 0000000..6c914f5 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/dialer_call.png differ diff --git a/app/src/main/res/drawable-hdpi/home_dialer_icon_circle.png b/app/src/main/res/drawable-hdpi/home_dialer_icon_circle.png new file mode 100644 index 0000000..3a343f4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_dialer_icon_circle.png differ diff --git a/app/src/main/res/drawable-hdpi/home_dialer_icon_contacts.png b/app/src/main/res/drawable-hdpi/home_dialer_icon_contacts.png new file mode 100644 index 0000000..acc36de Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_dialer_icon_contacts.png differ diff --git a/app/src/main/res/drawable-hdpi/home_dialer_icon_records.png b/app/src/main/res/drawable-hdpi/home_dialer_icon_records.png new file mode 100644 index 0000000..5ff6be6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_dialer_icon_records.png differ diff --git a/app/src/main/res/drawable-hdpi/home_icon_add.png b/app/src/main/res/drawable-hdpi/home_icon_add.png index 7bae7b1..7724009 100644 Binary files a/app/src/main/res/drawable-hdpi/home_icon_add.png and b/app/src/main/res/drawable-hdpi/home_icon_add.png differ diff --git a/app/src/main/res/drawable-hdpi/home_icon_edit.png b/app/src/main/res/drawable-hdpi/home_icon_edit.png new file mode 100644 index 0000000..72e1654 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_icon_edit.png differ diff --git a/app/src/main/res/drawable-hdpi/sim_card.png b/app/src/main/res/drawable-hdpi/sim_card.png new file mode 100644 index 0000000..b0364a6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sim_card.png differ diff --git a/app/src/main/res/drawable/add_contact_bg.xml b/app/src/main/res/drawable/add_contact_bg.xml new file mode 100644 index 0000000..d05e149 --- /dev/null +++ b/app/src/main/res/drawable/add_contact_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dialer_call_bg.xml b/app/src/main/res/drawable/dialer_call_bg.xml new file mode 100644 index 0000000..39dce6e --- /dev/null +++ b/app/src/main/res/drawable/dialer_call_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fragment_add_contact_background.xml b/app/src/main/res/drawable/fragment_add_contact_background.xml new file mode 100644 index 0000000..7a66681 --- /dev/null +++ b/app/src/main/res/drawable/fragment_add_contact_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/phone_navigation_backround.xml b/app/src/main/res/drawable/phone_navigation_backround.xml new file mode 100644 index 0000000..cdbf70e --- /dev/null +++ b/app/src/main/res/drawable/phone_navigation_backround.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/position_background.xml b/app/src/main/res/drawable/position_background.xml index 4ab9b85..e981267 100644 --- a/app/src/main/res/drawable/position_background.xml +++ b/app/src/main/res/drawable/position_background.xml @@ -11,8 +11,8 @@ android:topRightRadius="@dimen/dp_16" /> + android:bottom="@dimen/dp_6" + android:left="@dimen/dp_16" + android:right="@dimen/dp_16" + android:top="@dimen/dp_6" /> \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_contact.xml b/app/src/main/res/layout-land/activity_contact.xml index be00234..0374cd9 100644 --- a/app/src/main/res/layout-land/activity_contact.xml +++ b/app/src/main/res/layout-land/activity_contact.xml @@ -1,77 +1,88 @@ - + + + + + android:layout_height="match_parent" + android:background="@drawable/control_bg"> - + app:layout_constraintTop_toTopOf="parent"> - + - + - + + + + + + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout" /> + - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_dailyapp.xml b/app/src/main/res/layout-land/activity_dailyapp.xml index 36f7f2b..3de638c 100644 --- a/app/src/main/res/layout-land/activity_dailyapp.xml +++ b/app/src/main/res/layout-land/activity_dailyapp.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/control_bg" - tools:context=".activity.DailyAppActivity"> + tools:context=".activity.dailyapp.DailyAppActivity"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index a0fbbb6..89dee63 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -1,690 +1,698 @@ - + tools:context=".fragment.custom.CustomFragment"> - + + + + + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_margin="@dimen/sp_16"> - - - - - - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + - + app:layout_constraintEnd_toStartOf="@+id/constraintLayout6" + app:layout_constraintTop_toTopOf="parent"> - + - + + - + + + + + + + + app:layout_constraintTop_toTopOf="parent"> + + + + + + - - - - - - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout5"> + android:orientation="vertical"> - + android:layout_weight="1" + android:orientation="horizontal"> - + - + + + + + + + + + + + + + + + + + + + - - - - - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + - + + - - - + android:layout_marginEnd="@dimen/dp_4" + android:layout_marginBottom="@dimen/dp_2" + android:layout_weight="2" + android:background="@drawable/custom_bg_sos"> - + - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:orientation="horizontal"> - + + + + + + + + - + + + + + + + + + + + + - - - - - - - + + + + + + + + + - - + + + + + + + + + + - - - + android:layout_marginTop="@dimen/dp_2" + android:layout_marginEnd="@dimen/dp_2" + android:layout_marginBottom="@dimen/dp_4" + android:layout_weight="1" + android:background="@drawable/custom_bg_clean" + tools:ignore="NestedWeights"> - + - + - + + + + + + + + + + + - + + - + - + - + - + - - + - + - + - - + - + - + - - + + + + + + + + + + + + + + + + + - - + - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_dialer.xml b/app/src/main/res/layout-land/fragment_dialer.xml new file mode 100644 index 0000000..60d023f --- /dev/null +++ b/app/src/main/res/layout-land/fragment_dialer.xml @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml new file mode 100644 index 0000000..c2d9740 --- /dev/null +++ b/app/src/main/res/layout-land/fragment_home.xml @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/activity_contact.xml b/app/src/main/res/layout-port/activity_contact.xml index be00234..96c900f 100644 --- a/app/src/main/res/layout-port/activity_contact.xml +++ b/app/src/main/res/layout-port/activity_contact.xml @@ -1,77 +1,89 @@ - + + + + + + android:layout_height="match_parent" + android:background="@drawable/control_bg"> - + app:layout_constraintTop_toTopOf="parent"> - + - + - + + + + + + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout" /> + - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout-port/activity_dailyapp.xml b/app/src/main/res/layout-port/activity_dailyapp.xml index fd733c7..9363681 100644 --- a/app/src/main/res/layout-port/activity_dailyapp.xml +++ b/app/src/main/res/layout-port/activity_dailyapp.xml @@ -5,18 +5,18 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/control_bg" - tools:context=".activity.DailyAppActivity"> + tools:context=".activity.dailyapp.DailyAppActivity"> diff --git a/app/src/main/res/layout-port/activity_phone.xml b/app/src/main/res/layout-port/activity_phone.xml new file mode 100644 index 0000000..004c00a --- /dev/null +++ b/app/src/main/res/layout-port/activity_phone.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/fragment_custom.xml b/app/src/main/res/layout-port/fragment_custom.xml index 325f08f..c32272b 100644 --- a/app/src/main/res/layout-port/fragment_custom.xml +++ b/app/src/main/res/layout-port/fragment_custom.xml @@ -1,779 +1,787 @@ - + tools:context=".fragment.custom.CustomFragment"> - + + + + + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_margin="@dimen/dp_16"> - - - - - - - - + app:layout_constraintTop_toTopOf="parent"> - + + + + + - + app:layout_constraintEnd_toStartOf="@+id/constraintLayout14" + app:layout_constraintTop_toTopOf="parent"> - + - + + - + + + + + + + + app:layout_constraintTop_toTopOf="parent"> + + + + + + - - - - - - - - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout5"> + android:layout_height="match_parent" + android:orientation="vertical"> - + - + - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + app:layout_constraintTop_toBottomOf="@+id/textView4" /> + - + android:orientation="vertical"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toStartOf="@+id/textView" + app:layout_constraintTop_toBottomOf="@+id/textView" /> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + - - - - - - - - - - - - + + - - - - - - - - - - - - - + - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/fragment_dialer.xml b/app/src/main/res/layout-port/fragment_dialer.xml new file mode 100644 index 0000000..c001b5c --- /dev/null +++ b/app/src/main/res/layout-port/fragment_dialer.xml @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/fragment_home.xml b/app/src/main/res/layout-port/fragment_home.xml new file mode 100644 index 0000000..1ac1ecb --- /dev/null +++ b/app/src/main/res/layout-port/fragment_home.xml @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_contact.xml b/app/src/main/res/layout/activity_add_contact.xml index e813a93..8409bd8 100644 --- a/app/src/main/res/layout/activity_add_contact.xml +++ b/app/src/main/res/layout/activity_add_contact.xml @@ -33,7 +33,7 @@ android:layout_marginStart="@dimen/dp_16" android:text="新建联系人" android:textColor="@color/default_text_color" - android:textSize="@dimen/sp_16" + android:textSize="@dimen/sp_18" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/iv_cancel" app:layout_constraintTop_toTopOf="parent" /> @@ -67,8 +67,8 @@ @@ -186,15 +186,15 @@ android:layout_marginStart="@dimen/dp_24" android:text="设为紧急联系人" android:textColor="@color/default_text_color" - android:textSize="@dimen/sp_15" + android:textSize="@dimen/sp_16" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + tools:context=".activity.addicon.AddIconActivity"> + + + + + + android:layout_height="match_parent"> - + + + + + + + + + - - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout" /> + - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_alarm_port.xml b/app/src/main/res/layout/activity_alarm_port.xml index 49ceab0..6fb9198 100644 --- a/app/src/main/res/layout/activity_alarm_port.xml +++ b/app/src/main/res/layout/activity_alarm_port.xml @@ -28,7 +28,7 @@ @@ -44,8 +44,8 @@ diff --git a/app/src/main/res/layout/activity_location.xml b/app/src/main/res/layout/activity_location.xml index 90cd141..3d59fce 100644 --- a/app/src/main/res/layout/activity_location.xml +++ b/app/src/main/res/layout/activity_location.xml @@ -10,7 +10,7 @@ @@ -44,7 +44,7 @@ @@ -96,6 +96,7 @@ android:id="@+id/rv_city" android:layout_width="match_parent" android:layout_height="0dp" + android:layout_marginTop="@dimen/dp_8" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView22" /> @@ -125,7 +126,7 @@ android:layout_height="wrap_content" android:text="我的位置" android:textColor="@color/white" - android:textSize="@dimen/sp_9" + android:textSize="@dimen/sp_16" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main_old.xml similarity index 96% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/activity_main_old.xml index da44c26..c4d82b5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main_old.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/control_background" - tools:context=".activity.main.MainActivity"> + tools:context=".activity.main.OldMainActivity"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather.xml b/app/src/main/res/layout/activity_weather.xml index 68ae0ef..7d4820b 100644 --- a/app/src/main/res/layout/activity_weather.xml +++ b/app/src/main/res/layout/activity_weather.xml @@ -24,13 +24,13 @@ @@ -76,7 +76,7 @@ android:scaleType="centerCrop" android:text="刷新" android:textColor="@color/white" - android:textSize="@dimen/sp_13" + android:textSize="@dimen/sp_18" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -114,7 +114,7 @@ android:layout_marginTop="@dimen/dp_4" android:maxLines="1" android:textColor="@color/gray" - android:textSize="@dimen/sp_14" + android:textSize="@dimen/sp_16" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -122,6 +122,7 @@ @@ -133,7 +134,7 @@ android:layout_marginTop="@dimen/dp_16" android:maxLines="1" android:textColor="@color/white" - android:textSize="@dimen/sp_48" + android:textSize="@dimen/sp_54" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:setTemp="@{nowBaseBean.getTemp()}" @@ -148,7 +149,7 @@ android:maxLines="1" android:text="@{nowBaseBean.getText()}" android:textColor="@color/gray" - android:textSize="@dimen/sp_14" + android:textSize="@dimen/sp_16" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/tv_temp" app:layout_constraintTop_toBottomOf="@id/tv_temp" @@ -161,7 +162,7 @@ android:layout_marginStart="@dimen/dp_16" android:maxLines="1" android:textColor="@color/gray" - android:textSize="@dimen/sp_14" + android:textSize="@dimen/sp_16" app:layout_constraintBottom_toBottomOf="@+id/tv_text_day" app:layout_constraintStart_toEndOf="@+id/tv_text_day" app:layout_constraintTop_toTopOf="@+id/tv_text_day" @@ -169,8 +170,8 @@ - + tools:context=".fragment.app.AppListFragment"> - + + + + + android:layout_height="match_parent"> - - - - - - - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_contact.xml b/app/src/main/res/layout/fragment_contact.xml new file mode 100644 index 0000000..04e4cd1 --- /dev/null +++ b/app/src/main/res/layout/fragment_contact.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_contact_home.xml b/app/src/main/res/layout/fragment_contact_home.xml new file mode 100644 index 0000000..abe0feb --- /dev/null +++ b/app/src/main/res/layout/fragment_contact_home.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml deleted file mode 100644 index 4ff441c..0000000 --- a/app/src/main/res/layout/fragment_home.xml +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_record.xml b/app/src/main/res/layout/fragment_record.xml new file mode 100644 index 0000000..40ec807 --- /dev/null +++ b/app/src/main/res/layout/fragment_record.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_actions.xml b/app/src/main/res/layout/item_actions.xml index 59d3023..82dd35e 100644 --- a/app/src/main/res/layout/item_actions.xml +++ b/app/src/main/res/layout/item_actions.xml @@ -51,8 +51,8 @@ @@ -96,7 +96,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_2" android:textColor="@color/white" - android:textSize="@dimen/sp_12" + android:textSize="@dimen/sp_16" app:layout_constraintEnd_toEndOf="@+id/iv" app:layout_constraintStart_toStartOf="@+id/iv" app:layout_constraintTop_toBottomOf="@+id/iv" /> diff --git a/app/src/main/res/layout/item_add_app.xml b/app/src/main/res/layout/item_add_app.xml index 9aa755f..1b33321 100644 --- a/app/src/main/res/layout/item_add_app.xml +++ b/app/src/main/res/layout/item_add_app.xml @@ -16,8 +16,8 @@ - - + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + app:layout_constraintVertical_bias="0.215" /> + app:layout_constraintEnd_toEndOf="@+id/iv_head" + app:layout_constraintStart_toStartOf="@+id/iv_head" + app:layout_constraintTop_toBottomOf="@+id/iv_head"> @@ -62,8 +73,9 @@ android:layout_marginTop="@dimen/dp_4" android:maxLines="1" android:singleLine="true" - android:textColor="@color/white" - android:textSize="@dimen/sp_12" + android:textColor="@color/contact_text_color" + android:textSize="@dimen/sp_16" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_name" tools:text="phone" /> @@ -72,11 +84,11 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_contact_old.xml b/app/src/main/res/layout/item_contact_old.xml new file mode 100644 index 0000000..0147bbb --- /dev/null +++ b/app/src/main/res/layout/item_contact_old.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_daily_app.xml b/app/src/main/res/layout/item_daily_app.xml index e513e9b..d4444b6 100644 --- a/app/src/main/res/layout/item_daily_app.xml +++ b/app/src/main/res/layout/item_daily_app.xml @@ -7,7 +7,7 @@ @@ -10,12 +10,12 @@ android:id="@+id/tv_district" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/dp_16" - android:layout_marginEnd="@dimen/dp_16" + android:layout_marginStart="@dimen/dp_8" + android:layout_marginEnd="@dimen/dp_8" android:maxLines="1" android:text="北京" android:textColor="@color/black" - android:textSize="@dimen/sp_11" + android:textSize="@dimen/sp_16" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_home_app.xml b/app/src/main/res/layout/item_home_app.xml index e4ac7a0..162f783 100644 --- a/app/src/main/res/layout/item_home_app.xml +++ b/app/src/main/res/layout/item_home_app.xml @@ -16,8 +16,8 @@ + app:layout_constraintTop_toTopOf="parent" + tools:text="17:48" /> @@ -43,8 +43,8 @@ + app:layout_constraintTop_toTopOf="parent" + tools:text="15-22" /> diff --git a/app/src/main/res/layout/phone_activity_main.xml b/app/src/main/res/layout/phone_activity_main.xml index c1cae04..385115f 100644 --- a/app/src/main/res/layout/phone_activity_main.xml +++ b/app/src/main/res/layout/phone_activity_main.xml @@ -1,28 +1,195 @@ - + tools:context=".activity.main.MainActivity"> - + + + + + + android:layout_height="match_parent" + android:background="@drawable/control_background"> - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/phone_fragment_control.xml b/app/src/main/res/layout/phone_fragment_control.xml index de03f8e..19e4612 100644 --- a/app/src/main/res/layout/phone_fragment_control.xml +++ b/app/src/main/res/layout/phone_fragment_control.xml @@ -1,401 +1,408 @@ - + tools:context=".fragment.control.ControlFragment"> - + + + + + android:layout_height="match_parent"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:layout_margin="@dimen/dp_12" + android:orientation="vertical" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="3" + android:orientation="horizontal"> - + android:background="@drawable/control_background_item_dis"> - + - + + + + + android:background="@drawable/control_background_item_dis"> + + + + + + - - + - - - + - + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3e9a735..b8796dd 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -68,4 +68,6 @@ #e6e6e6 #3D54D9 + #98999a + diff --git a/settings.gradle b/settings.gradle index 6979b42..02b1d4c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ include ':app', ':niceimageview', ':verification-view' -rootProject.name='AIOS系统' \ No newline at end of file +rootProject.name='AIOS系统Phone' \ No newline at end of file