diff --git a/app/build.gradle b/app/build.gradle index 2416e85..39f9ed5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { applicationId "com.ttstd.dialer" //There are no CERT files because If the mini sdk version is 23+, the AGP will ignore the V1 scheme signature. - minSdkVersion 23 +// minSdkVersion 23 targetSdkVersion 37 versionCode 1 versionName "1.0" @@ -95,6 +95,21 @@ android { } } + flavorDimensions "version" + productFlavors { + // 用于正常开发和发布的版本 + normal { + dimension "version" + minSdkVersion 23 // 你的原始最低版本 + } + // 专门用于调试高版本特性的版本 + debugApi26 { + dimension "version" + minSdkVersion 31 // 为了使用 Database Inspector + } + } + + signingConfigs { keypub { storeFile file(rootProject.ext.signingConfigs.keypub.storeFile) @@ -194,9 +209,9 @@ dependencies { implementation project(path: ':iconloader') // 添加 Kotlin 标准库 - implementation "org.jetbrains.kotlin:kotlin-stdlib:2.2.10" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // 添加这行,使用 BOM 统一 Kotlin 相关库的版本 - implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.2.10")) + implementation(platform("org.jetbrains.kotlin:kotlin-bom:$kotlin_version")) implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.11.0' @@ -230,7 +245,9 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0' - implementation 'com.google.android.material:material:1.13.0' + implementation 'com.google.android.material:material:1.14.0' + implementation 'com.googlecode.libphonenumber:libphonenumber:9.0.30' + //glide implementation 'com.github.bumptech.glide:glide:4.15.1' kapt 'com.github.bumptech.glide:compiler:4.15.1' @@ -242,12 +259,13 @@ dependencies { //RxJava implementation 'io.reactivex.rxjava3:rxjava:3.1.12' implementation 'io.reactivex.rxjava3:rxandroid:3.0.2' - // + + implementation 'com.squareup.moshi:moshi:1.15.2' implementation 'com.squareup.okhttp3:okhttp:5.3.2' implementation 'com.squareup.okhttp3:logging-interceptor:5.3.2' implementation 'com.squareup.retrofit2:retrofit:3.0.0' implementation 'com.squareup.retrofit2:converter-gson:3.0.0' -// implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' +// implementation 'com.squareup.retrofit2:adapter-rxjava2:3.0.0' implementation "com.squareup.retrofit2:adapter-rxjava3:3.0.0" //Gson implementation 'com.google.code.gson:gson:2.14.0' @@ -262,7 +280,8 @@ dependencies { implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0' /*https://github.com/JeremyLiao/LiveEventBus*/ - implementation 'com.jeremyliao:live-event-bus-x:1.7.3' +// implementation 'io.github.jeremyliao:live-event-bus:1.8.0' + implementation 'com.github.neo-turak:LiveEventBus:1.8.1' implementation 'com.facebook.rebound:rebound:0.3.8' //MMKV @@ -344,10 +363,8 @@ dependencies { implementation 'com.github.getActivity:Toaster:12.6' // 权限请求框架:https://github.com/getActivity/XXPermissions implementation 'com.github.getActivity:XXPermissions:20.0' - //autosize会改变第三方view的大小 - //https://github.com/JessYanCoding/AndroidAutoSize -// implementation 'me.jessyan:autosize:1.2.1' - + implementation 'com.github.zcweng:switch-button:0.0.3@aar' + implementation "com.github.kongzue.DialogX:DialogX:0.0.50" } // 在 dependencies 之后添加 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9567e3a..b45c3d6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -80,6 +80,10 @@ android:name=".activity.contact.list.ContactListActivity" android:launchMode="singleTask" android:screenOrientation="portrait" /> + { @@ -39,18 +43,30 @@ public class ContactAddActivity extends BaseMvvmActivity() { + mViewModel.mOnlineIdData.observe(this, new Observer() { @Override public void onChanged(Long aLong) { if (aLong > 0) { + Toaster.show("添加成功"); finish(); + } else { + } } }); + mViewModel.mDbIdData.observe(this, new Observer() { + @Override + public void onChanged(Long aLong) { + finish(); + } + }); + + } public class BtnClick { @@ -59,9 +75,53 @@ public class ContactAddActivity extends BaseMvvmActivity mOnlineIdData = new MutableLiveData<>(); + public MutableLiveData mDbIdData = new MutableLiveData<>(); + @Override public void setContext(Context context) { super.setContext(context); mRepository = new ContactRepository(context); } - public MutableLiveData mIntegerMutableLiveData = new MutableLiveData<>(); - - public void saveContact(String name, String phone) { - Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { - int count = mRepository.getTotalCount() + 1; - ContactInfo contactInfo = new ContactInfo(name, phone, count); - Logger.e(TAG, "saveContact: " + contactInfo); - emitter.onNext(mRepository.insert(contactInfo)); - emitter.onComplete(); - } - }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + public void addContact(ContactInfo contactInfo) { + OkHttpManager.getInstance().getContactInsertObservable(contactInfo, getLifecycle()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + .flatMap(baseResponse -> { + Logger.e(TAG, "addContact", "网络请求响应: " + baseResponse); + if (baseResponse.isSuccess()) { + Long id = baseResponse.getData(); + mOnlineIdData.setValue(id); + return Observable.just(id); + } else { + Logger.w(TAG, "业务失败,降级到本地保存: " + baseResponse.getMsg()); + return saveContactObservable(contactInfo); + } + }) + .onErrorResumeNext(throwable -> { + Logger.e(TAG, "网络异常,降级到本地保存: " + throwable.getMessage()); + return saveContactObservable(contactInfo); + }) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Logger.d(TAG, "开始添加联系人"); + } + + @Override + public void onNext(@NonNull Long id) { + Logger.d(TAG, "联系人保存成功,ID: " + id); + if (mOnlineIdData.getValue() == null) { + mDbIdData.setValue(id); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Logger.e(TAG, "添加联系人最终失败: " + e.getMessage()); + } + + @Override + public void onComplete() { + Logger.d(TAG, "添加联系人流程完成"); + } + }); + } + + private Observable saveContactObservable(ContactInfo contactInfo) { + return Observable.create((ObservableOnSubscribe) emitter -> { + Logger.d(TAG, "执行本地保存: " + contactInfo); + contactInfo.setPosition(mRepository.getTotalCount() + 1); + contactInfo.setLocalId(System.currentTimeMillis()); + long id = mRepository.insert(contactInfo); + Logger.d(TAG, "执行本地保存: id = " + id); + emitter.onNext(id); + emitter.onComplete(); + }).subscribeOn(Schedulers.io()); + } + + public void saveContact(ContactInfo contactInfo) { + saveContactObservable(contactInfo) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -55,7 +105,7 @@ public class ContactAddViewModel extends BaseViewModel { + private ContactInfo mContactInfo; @Override public boolean setNightMode() { return true; } + @Override + public boolean setfitWindow() { + return true; + } + @Override protected int getLayoutId() { return R.layout.activity_contact_edit; @@ -33,15 +47,65 @@ public class ContactEditActivity extends BaseMvvmActivity() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + Toaster.show("编辑成功"); + finish(); + } + } + }); } - - public class BtnClick{ + public class BtnClick { public void exit(View view) { finish(); } + + public void update(View view) { + ContactInfo contactInfo = new ContactInfo(mContactInfo); + if (mViewDataBinding.etName.getText() == null) { + Toaster.show("请输入姓名"); + return; + } + String name = mViewDataBinding.etName.getText().toString(); + + if (mViewDataBinding.etPhone.getText() == null) { + Toaster.show("请输入手机号码"); + return; + } + + String phone = mViewDataBinding.etPhone.getText().toString(); + + if (!PhoneUtils.isValidPhone(phone)) { + Toaster.show("手机号码格式错误"); + return; + } + + contactInfo.setName(name); + contactInfo.setPhoneNumber(phone); + if (mViewDataBinding.etRemark.getText() != null) { + String remark = mViewDataBinding.etRemark.getText().toString(); + contactInfo.setNickName(remark); + } else { + contactInfo.setNickName(""); + } + contactInfo.setEmergency(mViewDataBinding.sbEmergency.isChecked()); + contactInfo.setShowDesktop(mViewDataBinding.sbShow.isChecked()); + contactInfo.setUpdateTime(System.currentTimeMillis()); + + mViewModel.updateContact(mContactInfo.getId(), contactInfo); + } } } diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/edit/ContactEditViewModel.java b/app/src/main/java/com/ttstd/dialer/activity/contact/edit/ContactEditViewModel.java index 45fcc9e..b47383c 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/contact/edit/ContactEditViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/edit/ContactEditViewModel.java @@ -1,8 +1,42 @@ package com.ttstd.dialer.activity.contact.edit; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.hjq.toast.Toaster; import com.trello.rxlifecycle4.android.ActivityEvent; import com.ttstd.dialer.base.mvvm.BaseViewModel; +import com.ttstd.dialer.bean.BaseResponse; import com.ttstd.dialer.databinding.ActivityContactEditBinding; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.network.BaseObserver; +import com.ttstd.dialer.network.OkHttpManager; -public class ContactEditViewModel extends BaseViewModel { +public class ContactEditViewModel extends BaseViewModel { + + public MutableLiveData mBooleanMutableLiveData = new MutableLiveData<>(); + + public void updateContact(long id, ContactInfo contactInfo) { + OkHttpManager.getInstance().getContactUpdateObservable(id, contactInfo, getLifecycle()) + .safeSubscribe(new BaseObserver>() { + @Override + public void onSuccess(BaseResponse baseResponse) { + Log.e("updateContact", "onSuccess: " + baseResponse); + if (baseResponse.isSuccess()) { + mBooleanMutableLiveData.postValue(true); + } else { + mBooleanMutableLiveData.postValue(false); + Toaster.show(baseResponse.getMsg()); + } + } + + @Override + public void onFailure(Throwable e) { + Log.e("updateContact", "onFailure: " + e.getMessage()); + mBooleanMutableLiveData.postValue(false); + Toaster.show("网络错误,请稍后再试"); + } + }); + } } diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java index f5a9541..2d97f67 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/list/ContactListActivity.java @@ -8,14 +8,21 @@ import androidx.annotation.NonNull; import androidx.lifecycle.Observer; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.kongzue.dialogx.dialogs.TipDialog; +import com.kongzue.dialogx.dialogs.WaitDialog; import com.ttstd.dialer.R; import com.ttstd.dialer.activity.contact.add.ContactAddActivity; +import com.ttstd.dialer.activity.contact.edit.ContactEditActivity; +import com.ttstd.dialer.activity.contact.test.ContactTestActivity; import com.ttstd.dialer.adapter.ContactInfoAdapter; import com.ttstd.dialer.base.mvvm.BaseMvvmActivity; import com.ttstd.dialer.databinding.ActivityContactListBinding; import com.ttstd.dialer.db.contact.ContactInfo; -import com.ttstd.dialer.fragment.dialog.call.CallFragment; +import com.ttstd.dialer.fragment.dialog.contact.call.CallFragment; +import com.ttstd.dialer.fragment.dialog.contact.delete.ContactDeleteDialogFragment; +import com.ttstd.dialer.fragment.dialog.contact.edit.EditDialogFragment; import com.ttstd.dialer.utils.Logger; import com.ttstd.dialer.view.ItemTouchHelperCallback; @@ -29,6 +36,9 @@ public class ContactListActivity extends BaseMvvmActivity mContactInfos; + private EditDialogFragment mEditDialogFragment; + private ContactDeleteDialogFragment mContactDeleteDialogFragment; + ; @Override public boolean setNightMode() { @@ -55,6 +65,13 @@ public class ContactListActivity extends BaseMvvmActivity>() { @Override public void onChanged(List contactInfos) { - Logger.e(TAG, "mContactListData: " + contactInfos); - mContactInfos = contactInfos; - mContactInfoAdapter.setContactInfos(mContactInfos); + mViewDataBinding.swipeRefreshLayout.setRefreshing(false); + if (contactInfos == null) { + + } else { + Logger.e(TAG, "mContactListData: " + contactInfos); + mContactInfos = contactInfos; + mContactInfoAdapter.setContactInfos(mContactInfos); + } + } + }); + mViewModel.mDeleteLiveData.observe(this, new Observer() { + @Override + public void onChanged(Boolean aBoolean) { + if (aBoolean) { + TipDialog.show("删除成功", WaitDialog.TYPE.SUCCESS); + mViewModel.getAllContacts(); + } else { + TipDialog.show("删除失败", WaitDialog.TYPE.ERROR); + } } }); } @@ -139,9 +210,13 @@ public class ContactListActivity extends BaseMvvmActivity { private static final String TAG = "ContactListViewModel"; private ContactRepository mRepository; + private ContactManager mContactManager; @Override public void setContext(Context context) { super.setContext(context); mRepository = new ContactRepository(context); + mContactManager = ContactManager.getInstance(context); } public MutableLiveData> mContactListData = new MutableLiveData<>(); public void getAllContacts() { - Observable.create(new ObservableOnSubscribe>() { + mContactManager.getContacts(getLifecycle(), new ContactManager.ContactCallback() { @Override - public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { - List contactInfos = mRepository.getAllContacts(); - emitter.onNext(contactInfos); - emitter.onComplete(); + public void onSuccess(List contacts) { + Logger.e(TAG, "获取联系人成功: " + contacts.size()); + mContactListData.setValue(contacts); } - }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + + @Override + public void onFailure(Throwable e) { + Logger.e(TAG, "获取联系人失败: " + e.getMessage()); + mContactListData.setValue(null); + } + }); + +// OkHttpManager.getInstance().getContactListObservable(getLifecycle()) +// .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) +// .subscribe(new BaseObserver>>() { +// @Override +// public void onSuccess(BaseResponse> listBaseResponse) { +// Log.e("getAllContacts", "onSuccess: " + listBaseResponse); +// if (listBaseResponse.isSuccess()) { +// List contactInfos = listBaseResponse.getData(); +// List sorted = contactInfos.stream().sorted(new Comparator() { +// @Override +// public int compare(ContactInfo t0, ContactInfo t1) { +// return Integer.compare(t0.getPosition(), t1.getPosition()); +// } +// }).collect(Collectors.toList()); +// mContactListData.setValue(sorted); +// } +// } +// +// @Override +// public void onFailure(Throwable e) { +// Log.e("getAllContacts", "onFailure: " + e.getMessage()); +// mContactListData.setValue(null); +// } +// }); + } + + private void getAllContactsFromDB() { + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + List contactInfos = mRepository.getAllContacts(); + emitter.onNext(contactInfos); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer>() { @@ -55,7 +102,7 @@ public class ContactListViewModel extends BaseViewModel contactInfos) { Logger.e("getAllContacts", "onNext: "); - mContactListData.setValue(contactInfos); +// mContactListData.setValue(contactInfos); // List sorted = contacts.stream().sorted(new Comparator() { // @Override @@ -81,13 +128,13 @@ public class ContactListViewModel extends BaseViewModel() { - @Override - public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { - int id = mRepository.update(contactInfo); - emitter.onNext(id); - emitter.onComplete(); - } - }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + int id = mRepository.update(contactInfo); + emitter.onNext(id); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -113,4 +160,22 @@ public class ContactListViewModel extends BaseViewModel mDeleteLiveData = new MutableLiveData<>(); + + public void deleteContact(long id) { + OkHttpManager.getInstance().getContactDeleteObservable(id, getLifecycle()) + .safeSubscribe(new BaseObserver() { + @Override + public void onSuccess(BaseResponse baseResponse) { + Logger.e("deleteContact", "onSuccess: " + baseResponse); + mDeleteLiveData.setValue(baseResponse.isSuccess()); + } + + @Override + public void onFailure(Throwable e) { + Logger.e("deleteContact", "onFailure: " + e.getMessage()); + mDeleteLiveData.setValue(false); + } + }); + } } diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestActivity.java b/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestActivity.java new file mode 100644 index 0000000..cea1a39 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestActivity.java @@ -0,0 +1,245 @@ +package com.ttstd.dialer.activity.contact.test; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.ttstd.dialer.R; +import com.ttstd.dialer.activity.contact.add.ContactAddActivity; +import com.ttstd.dialer.adapter.ContactInfoAdapter; +import com.ttstd.dialer.base.mvvm.BaseMvvmActivity; +import com.ttstd.dialer.databinding.ActivityContactTestBinding; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.fragment.dialog.contact.call.CallFragment; +import com.ttstd.dialer.manager.ContactManager; +import com.ttstd.dialer.manager.ContactSyncManager; +import com.ttstd.dialer.utils.Logger; +import com.ttstd.dialer.view.ItemTouchHelperCallback; + +import java.util.List; + +public class ContactTestActivity extends BaseMvvmActivity { + + private static final String TAG = "ContactTestActivity"; + private static final int REQUEST_CODE_CALL = 7897; + + private ContactInfoAdapter mOnlineContactInfoAdapter; + private ContactInfoAdapter mLocalContactInfoAdapter; + + private List mOnlineContactInfos; + private List mLocalContactInfos; + + @Override + public boolean setNightMode() { + return true; + } + + @Override + public boolean setfitWindow() { + return true; + } + + @Override + protected int getLayoutId() { + return R.layout.activity_contact_test; + } + + @Override + protected void initDataBinding() { + mViewModel.setContext(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + mOnlineContactInfoAdapter = new ContactInfoAdapter(); + mOnlineContactInfoAdapter.setItemMoveCallback(new ContactInfoAdapter.ItemMoveCallback() { + @Override + public void onItemMove(int fromPosition, int toPosition) { + Logger.e(TAG, "mOnlineContactInfoAdapter onItemMove: "); + ContactInfo fromContactInfo = mOnlineContactInfos.get(fromPosition); + int fromContactPosition = fromContactInfo.getPosition(); + ContactInfo toContactInfo = mOnlineContactInfos.get(toPosition); + int toContactPosition = toContactInfo.getPosition(); + fromContactInfo.setPosition(toContactPosition); + mViewModel.updateItemPosition(fromContactInfo); + toContactInfo.setPosition(fromContactPosition); + mViewModel.updateItemPosition(toContactInfo); + } + + @Override + public void onItemRemoved(int position) { + Logger.e(TAG, "mOnlineContactInfoAdapter onItemRemoved: "); + + } + }); + mOnlineContactInfoAdapter.setOnClickListener(new ContactInfoAdapter.ClickListener() { + @Override + public void onClick(ContactInfo contactInfo) { + new CallFragment(contactInfo).show(getSupportFragmentManager(), "CallFragment"); + } + + @Override + public void onLongClick(ContactInfo contactInfo) { + + } + + @Override + public void onMoreOperationClick(ContactInfo contactInfo) { + + } + }); + // 设置ItemTouchHelper,实现拖动和滑动删除 + ItemTouchHelper.Callback callback = new ItemTouchHelperCallback(mOnlineContactInfoAdapter); + ItemTouchHelper touchHelper = new ItemTouchHelper(callback); + touchHelper.attachToRecyclerView(mViewDataBinding.rvOnline); + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + mViewDataBinding.rvOnline.setLayoutManager(linearLayoutManager); + mViewDataBinding.rvOnline.setAdapter(mOnlineContactInfoAdapter); + + mLocalContactInfoAdapter = new ContactInfoAdapter(); + mLocalContactInfoAdapter.setItemMoveCallback(new ContactInfoAdapter.ItemMoveCallback() { + @Override + public void onItemMove(int fromPosition, int toPosition) { + Logger.e(TAG, "mLocalContactInfoAdapter onItemMove: "); + ContactInfo fromContactInfo = mOnlineContactInfos.get(fromPosition); + int fromContactPosition = fromContactInfo.getPosition(); + ContactInfo toContactInfo = mOnlineContactInfos.get(toPosition); + int toContactPosition = toContactInfo.getPosition(); + fromContactInfo.setPosition(toContactPosition); + mViewModel.updateItemPosition(fromContactInfo); + toContactInfo.setPosition(fromContactPosition); + mViewModel.updateItemPosition(toContactInfo); + } + + @Override + public void onItemRemoved(int position) { + Logger.e(TAG, "mLocalContactInfoAdapter onItemRemoved: "); + + } + }); + mLocalContactInfoAdapter.setOnClickListener(new ContactInfoAdapter.ClickListener() { + @Override + public void onClick(ContactInfo contactInfo) { + new CallFragment(contactInfo).show(getSupportFragmentManager(), "CallFragment"); + } + + @Override + public void onLongClick(ContactInfo contactInfo) { + + } + + @Override + public void onMoreOperationClick(ContactInfo contactInfo) { + + } + }); + // 设置ItemTouchHelper,实现拖动和滑动删除 + ItemTouchHelper.Callback callbackLocal = new ItemTouchHelperCallback(mLocalContactInfoAdapter); + ItemTouchHelper touchHelperLocal = new ItemTouchHelper(callbackLocal); + touchHelperLocal.attachToRecyclerView(mViewDataBinding.rvLocal); + + LinearLayoutManager linearLayoutManagerLocal = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + mViewDataBinding.rvLocal.setLayoutManager(linearLayoutManagerLocal); + mViewDataBinding.rvLocal.setAdapter(mLocalContactInfoAdapter); + } + + @Override + protected void initData() { + mViewModel.mOnlineContactListData.observe(this, new Observer>() { + @Override + public void onChanged(List contactInfos) { + if (contactInfos == null) { + + } else { + mViewDataBinding.tvOnline.setText("在线联系人:" + contactInfos.size() + "个"); + Logger.e(TAG, "mOnlineContactListData: " + contactInfos); + mOnlineContactInfos = contactInfos; + mOnlineContactInfoAdapter.setContactInfos(mOnlineContactInfos); + } + } + }); + + mViewModel.mLocalContactListData.observe(this, new Observer>() { + @Override + public void onChanged(List contactInfos) { + if (contactInfos == null) { + + } else { + mViewDataBinding.tvLocal.setText("本地联系人:" + contactInfos.size() + "个"); + Logger.e(TAG, "mLocalContactListData: " + contactInfos); + mLocalContactInfos = contactInfos; + mLocalContactInfoAdapter.setContactInfos(mLocalContactInfos); + } + } + }); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == REQUEST_CODE_CALL) { + // 检查所有权限的结果是否都已授予 + boolean allGranted = true; + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + allGranted = false; + break; + } + } + +// if (allGranted) { +// onAllPermissionsGranted(); // 权限全部获取成功 +// } else { +// // 处理权限被拒绝的情况 +// handlePermissionDenied(); +// } + } + } + + + @Override + protected void onResume() { + super.onResume(); + mViewModel.getAllContacts(); + mViewModel.getAllContactsFromDB(); + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + + public void getOnlineContact(View view) { + mViewModel.getAllContacts(); + } + + public void getLocalContact(View view) { + mViewModel.getAllContactsFromDB(); + } + + public void compareContact(View view) { + ContactManager.getInstance(ContactTestActivity.this).compareContacts(mOnlineContactInfos, mLocalContactInfos); + } + + public void syncContact(View view) { + ContactSyncManager.getInstance(ContactTestActivity.this).syncPendingContacts(); + } + + + public void addContact(View view) { + startActivity(new Intent(ContactTestActivity.this, ContactAddActivity.class)); + } + } +} diff --git a/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestViewModel.java b/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestViewModel.java new file mode 100644 index 0000000..62e43f0 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/activity/contact/test/ContactTestViewModel.java @@ -0,0 +1,151 @@ +package com.ttstd.dialer.activity.contact.test; + +import android.content.Context; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.ttstd.dialer.base.mvvm.BaseViewModel; +import com.ttstd.dialer.bean.BaseResponse; +import com.ttstd.dialer.databinding.ActivityContactTestBinding; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.db.contact.ContactRepository; +import com.ttstd.dialer.network.BaseObserver; +import com.ttstd.dialer.network.OkHttpManager; +import com.ttstd.dialer.utils.Logger; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +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 ContactTestViewModel extends BaseViewModel { + private static final String TAG = "ContactListViewModel"; + private ContactRepository mRepository; + + @Override + public void setContext(Context context) { + super.setContext(context); + mRepository = new ContactRepository(context); + } + + public MutableLiveData> mOnlineContactListData = new MutableLiveData<>(); + + public void getAllContacts() { + OkHttpManager.getInstance().getContactListObservable(getLifecycle()) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(BaseResponse> listBaseResponse) { + Log.e("getAllContacts", "onSuccess: " + listBaseResponse); + if (listBaseResponse.isSuccess()) { + List contactInfos = listBaseResponse.getData(); + List sorted = contactInfos.stream().sorted(new Comparator() { + @Override + public int compare(ContactInfo t0, ContactInfo t1) { + return Integer.compare(t0.getPosition(), t1.getPosition()); + } + }).collect(Collectors.toList()); + mOnlineContactListData.setValue(sorted); + } + } + + @Override + public void onFailure(Throwable e) { + Log.e("getAllContacts", "onFailure: " + e.getMessage()); + mOnlineContactListData.setValue(null); + } + }); + } + + public MutableLiveData> mLocalContactListData = new MutableLiveData<>(); + + public void getAllContactsFromDB() { + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + List contactInfos = mRepository.getAllContacts(); + emitter.onNext(contactInfos); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Logger.e("getAllContacts", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull List contactInfos) { + Logger.e("getAllContacts", "onNext: "); +// mLocalContactListData.setValue(contactInfos); + + List sorted = contactInfos.stream().sorted(new Comparator() { + @Override + public int compare(ContactInfo o1, ContactInfo o2) { + return Integer.compare(o1.getPosition(), o2.getPosition()); + } + }).collect(Collectors.toList()); + mLocalContactListData.setValue(sorted); + } + + @Override + public void onError(@NonNull Throwable e) { + Logger.e("getAllContacts", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Logger.e("getAllContacts", "onComplete: "); + } + }); + } + + public void updateItemPosition(ContactInfo contactInfo) { + Logger.e(TAG, "updateItemPosition: " + contactInfo); + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + int id = mRepository.update(contactInfo); + emitter.onNext(id); + emitter.onComplete(); + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Logger.e("updateItemPosition", "onComplete: "); + } + + @Override + public void onNext(@NonNull Integer integer) { + Logger.e("updateItemPosition", "onNext: " + integer); + } + + @Override + public void onError(@NonNull Throwable e) { + Logger.e("updateItemPosition", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Logger.e("updateItemPosition", "onComplete: "); + } + }); + } + +} diff --git a/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java b/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java index a1465f4..0c1bb38 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.util.Log; import android.view.KeyEvent; import android.view.Window; import android.view.WindowManager; @@ -35,14 +36,12 @@ import com.ttstd.dialer.wallpager.WallpaperScrollHelper; import net.lucode.hackware.magicindicator.ViewPagerHelper; -import java.util.concurrent.CancellationException; import java.util.ArrayList; import java.util.List; import kotlinx.coroutines.CoroutineScope; import kotlinx.coroutines.CoroutineScopeKt; import kotlinx.coroutines.Job; -import kotlinx.coroutines.flow.FlowKt; public class MainActivity extends BaseMvvmActivity { private static final String TAG = "MainActivity"; @@ -94,14 +93,14 @@ public class MainActivity extends BaseMvvmActivity { - if (weatherNowResponse != null) { - Logger.e(TAG, "weatherNowResponse = " + weatherNowResponse); - } - return null; - }); - } +// private void observeWeatherUpdates() { +// // 观察当前天气更新 +// weatherNowJob = weatherUpdateManager.observeWeatherNow(weatherScope, weatherNowResponse -> { +// if (weatherNowResponse != null) { +// Logger.e(TAG, "observeWeatherUpdates", "weatherNowResponse = " + weatherNowResponse); +// } +// return null; +// }); +// +// weatherHourlyJob = weatherUpdateManager.observeWeatherHourly(weatherScope, weatherHourlyResponse -> { +// if (weatherHourlyResponse != null) { +// Logger.e(TAG, "observeWeatherUpdates", "weatherHourlyResponse = " + weatherHourlyResponse); +// } +// return null; +// }); +// +// weatherDailyJob = weatherUpdateManager.observeWeatherDaily(weatherScope, weatherDailyResponse -> { +// if (weatherDailyResponse != null) { +// Logger.e(TAG, "observeWeatherUpdates", "weatherDailyResponse = " + weatherDailyResponse); +// } +// return null; +// }); +// } private void showSystemWallpaperBehindActivity() { Window window = getWindow(); - // 关键:让系统壁纸显示在当前窗口后面 window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER); - // 窗口背景透明 window.setBackgroundDrawableResource(android.R.color.transparent); } @@ -357,7 +378,7 @@ public class MainActivity extends BaseMvvmActivity params = new HashMap<>(); - params.put("sn", SystemUtils.getSerial()); + params.put("sn", DeviceManagerService.getInstance().getSerial()); params.put("createtime", String.valueOf(createTime)); // Call call = NetInterfaceManager.getInstance().getScreenshotCall().sendScreenshot(params, body); // call.enqueue(new RetryCallback(call, 10, 30 * 1000) { diff --git a/app/src/main/java/com/ttstd/dialer/activity/weather/main/WeatherMainActivity.java b/app/src/main/java/com/ttstd/dialer/activity/weather/main/WeatherMainActivity.java index d9e9497..ebd025d 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/weather/main/WeatherMainActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/weather/main/WeatherMainActivity.java @@ -15,6 +15,7 @@ import com.ttstd.dialer.base.mvvm.BaseMvvmActivity; import com.ttstd.dialer.bean.req.SnLocationReq; import com.ttstd.dialer.config.CommonConfig; import com.ttstd.dialer.databinding.ActivityWeatherMainBinding; +import com.ttstd.dialer.manager.MapManager; import com.ttstd.dialer.utils.DateUtil; import com.ttstd.dialer.utils.Logger; @@ -84,6 +85,7 @@ public class WeatherMainActivity extends BaseMvvmActivity>() { @Override public void onChanged(List weatherDailies) { @@ -103,10 +105,12 @@ public class WeatherMainActivity extends BaseMvvmActivity() { @Override @@ -117,7 +121,6 @@ public class WeatherMainActivity extends BaseMvvmActivity() { + WeatherManager.getInstance().getWeatherNowAdCode(adCode, new Callback() { @Override public void onSuccess(WeatherNowResponse response) { Logger.e("getWeatherNow", "onSuccess: " + response); @@ -52,7 +52,7 @@ public class WeatherMainViewModel extends BaseViewModel() { + WeatherManager.getInstance().getWeather24HourAdCode(adCode, new Callback() { @Override public void onSuccess(WeatherHourlyResponse weatherHourlyResponse) { Logger.e("getWeather24h", "onSuccess: " + weatherHourlyResponse); @@ -79,7 +79,7 @@ public class WeatherMainViewModel extends BaseViewModel() { + WeatherManager.getInstance().getWeather10Day(adCode, new Callback() { @Override public void onSuccess(WeatherDailyResponse weatherDailyResponse) { Logger.e("getWeather10D", "onSuccess: "); diff --git a/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java b/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java index 33b2de4..e72f942 100644 --- a/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java +++ b/app/src/main/java/com/ttstd/dialer/adapter/ContactInfoAdapter.java @@ -13,6 +13,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.shehuan.niv.NiceImageView; import com.ttstd.dialer.R; import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.utils.AvatarCacheUtil; +import com.ttstd.dialer.utils.GlideUtils; import com.ttstd.dialer.utils.Logger; import java.util.Collections; @@ -42,14 +44,18 @@ public class ContactInfoAdapter extends RecyclerView.Adapter extends BaseDialogFragment { protected String mTag = this.getClass().getSimpleName(); /** @@ -43,11 +39,8 @@ public abstract class BaseMvvmDialogFragment vmClass; - // -// protected Toolbar toolbar; -// protected View statusBarView; - // - protected Bundle bundle;//来自getArguments() + + protected Bundle bundle; protected Bundle savedInstanceState; // protected Context context; @@ -64,7 +57,6 @@ public abstract class BaseMvvmDialogFragment(context); } @@ -82,14 +74,16 @@ public abstract class BaseMvvmDialogFragment) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; - mViewModel = new ViewModelProvider(this).get(vmClass); - // + try { + vmClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; + mViewModel = new ViewModelProvider(this).get(vmClass); + } catch (Exception e) { + Logger.e(mTag, "Failed to create ViewModel: " + e.getMessage()); + throw new RuntimeException("Failed to create ViewModel", e); + } + return mViewDataBinding.getRoot(); } @@ -98,33 +92,16 @@ public abstract class BaseMvvmDialogFragment { -// L.e(" >> LiveDataBus >> DATA_BUS_LOADING_FRAGMENT: %s", bool); -// if(bool) { -// showLoading(R.string.str_please_wait); -// } else { -// hideLoading(); -// } -// }); } @Override @@ -132,10 +109,7 @@ public abstract class BaseMvvmDialogFragment> hideLoading :: isShow: %s", isShow); -// if (isShow) -// mWaitDiaLogger.dismiss(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } - - /** - * 進入界面 - */ protected void onEnter() { } - /** - * 離開界面 - */ protected void onExit() { } diff --git a/app/src/main/java/com/ttstd/dialer/base/mvvm/fragment/BaseMvvmFragment.java b/app/src/main/java/com/ttstd/dialer/base/mvvm/fragment/BaseMvvmFragment.java index 29fe070..6ac925a 100644 --- a/app/src/main/java/com/ttstd/dialer/base/mvvm/fragment/BaseMvvmFragment.java +++ b/app/src/main/java/com/ttstd/dialer/base/mvvm/fragment/BaseMvvmFragment.java @@ -84,7 +84,6 @@ public abstract class BaseMvvmFragment) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; @@ -97,6 +96,7 @@ public abstract class BaseMvvmFragment searchContacts(String searchQuery); + + @Query("SELECT * FROM contacts WHERE sync_status = :status ORDER BY create_time ASC") + List getContactsBySyncStatus(int status); + + @Query("SELECT * FROM contacts WHERE sync_status != 1 ORDER BY create_time ASC") + List getUnsyncedContacts(); + + @Query("UPDATE contacts SET sync_status = :status, local_id = :localId, update_time = :updateTime WHERE id = :id") + int updateSyncStatus(long id, int status, Long localId, long updateTime); + + @Query("UPDATE contacts SET sync_status = :status WHERE id = :id") + int updateSyncStatusById(long id, int status); } diff --git a/app/src/main/java/com/ttstd/dialer/db/contact/ContactInfo.java b/app/src/main/java/com/ttstd/dialer/db/contact/ContactInfo.java index 8771e56..cc78ca8 100644 --- a/app/src/main/java/com/ttstd/dialer/db/contact/ContactInfo.java +++ b/app/src/main/java/com/ttstd/dialer/db/contact/ContactInfo.java @@ -2,11 +2,14 @@ package com.ttstd.dialer.db.contact; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.room.ColumnInfo; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.google.gson.Gson; import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; import java.io.Serializable; import java.util.Objects; @@ -14,25 +17,81 @@ import java.util.Objects; @Entity(tableName = "contacts") public class ContactInfo implements Serializable { + private static final long serialVersionUID = -4899154548784231165L; + @PrimaryKey(autoGenerate = true) - private int id; + private long id; + private String name; + + @SerializedName(value = "nickName", alternate = {"nick_name"}) + private String nickName; + + @SerializedName(value = "phoneNumber", alternate = {"phone_number"}) private String phoneNumber; + private String avatar; - private String wxid; + private int position; + private boolean emergency; + + @SerializedName(value = "showDesktop", alternate = {"show_desktop"}) + private boolean showDesktop; + + @SerializedName(value = "bindPhone", alternate = {"bind_phone"}) + private String bindPhone; + + @SerializedName(value = "bindSn", alternate = {"bind_sn"}) + private String bindSn; + + @SerializedName(value = "updateTime", alternate = {"update_time"}) + @ColumnInfo(name = "update_time") + private long updateTime; + + @SerializedName(value = "createTime", alternate = {"create_time"}) + @ColumnInfo(name = "create_time") + private long createTime; + + @ColumnInfo(name = "local_id") + private Long localId; + + @ColumnInfo(name = "sync_status") + private int syncStatus; + + public ContactInfo() { + + } + + // 本地添加 + @Ignore public ContactInfo(String name, String phoneNumber, int position) { this.name = name; this.phoneNumber = phoneNumber; this.position = position; } - public int getId() { + @Ignore + public ContactInfo(ContactInfo contactInfo) { + this.id = contactInfo.getId(); + this.name = contactInfo.name; + this.nickName = contactInfo.nickName; + this.phoneNumber = contactInfo.phoneNumber; + this.avatar = contactInfo.avatar; + this.position = contactInfo.position; + this.emergency = contactInfo.emergency; + this.showDesktop = contactInfo.showDesktop; + this.bindPhone = contactInfo.bindPhone; + this.bindSn = contactInfo.bindSn; + this.updateTime = contactInfo.updateTime; + this.createTime = contactInfo.createTime; + } + + public long getId() { return id; } - public void setId(int id) { + public void setId(long id) { this.id = id; } @@ -44,6 +103,14 @@ public class ContactInfo implements Serializable { this.name = name; } + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + public String getPhoneNumber() { return phoneNumber; } @@ -60,14 +127,6 @@ public class ContactInfo implements Serializable { this.avatar = avatar; } - public String getWxid() { - return wxid; - } - - public void setWxid(String wxid) { - this.wxid = wxid; - } - public int getPosition() { return position; } @@ -76,6 +135,70 @@ public class ContactInfo implements Serializable { this.position = position; } + public boolean isEmergency() { + return emergency; + } + + public void setEmergency(boolean emergency) { + this.emergency = emergency; + } + + public boolean isShowDesktop() { + return showDesktop; + } + + public void setShowDesktop(boolean showDesktop) { + this.showDesktop = showDesktop; + } + + public String getBindPhone() { + return bindPhone; + } + + public void setBindPhone(String bindPhone) { + this.bindPhone = bindPhone; + } + + public String getBindSn() { + return bindSn; + } + + public void setBindSn(String bindSn) { + this.bindSn = bindSn; + } + + public long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(long updateTime) { + this.updateTime = updateTime; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + public Long getLocalId() { + return localId; + } + + public void setLocalId(Long localId) { + this.localId = localId; + } + + public int getSyncStatus() { + return syncStatus; + } + + public void setSyncStatus(int syncStatus) { + this.syncStatus = syncStatus; + } + @Override public boolean equals(@Nullable Object obj) { if (obj instanceof ContactInfo) { diff --git a/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java b/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java index 69ded99..877196a 100644 --- a/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java +++ b/app/src/main/java/com/ttstd/dialer/db/contact/ContactRepository.java @@ -60,4 +60,20 @@ public class ContactRepository { public int deleteAll() { return mContactDao.deleteAll(); } + + public List getContactsBySyncStatus(int status) { + return mContactDao.getContactsBySyncStatus(status); + } + + public List getUnsyncedContacts() { + return mContactDao.getUnsyncedContacts(); + } + + public int updateSyncStatus(long id, int status, Long localId, long updateTime) { + return mContactDao.updateSyncStatus(id, status, localId, updateTime); + } + + public int updateSyncStatusById(long id, int status) { + return mContactDao.updateSyncStatusById(id, status); + } } diff --git a/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java b/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java index 12af605..70bb4cb 100644 --- a/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/db/contact/ContactViewModel.java @@ -6,6 +6,7 @@ import androidx.lifecycle.AndroidViewModel; import java.util.List; +@Deprecated public class ContactViewModel extends AndroidViewModel { private ContactRepository mRepository; diff --git a/app/src/main/java/com/ttstd/dialer/db/contact/SyncStatus.java b/app/src/main/java/com/ttstd/dialer/db/contact/SyncStatus.java new file mode 100644 index 0000000..7ef2f2a --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/db/contact/SyncStatus.java @@ -0,0 +1,21 @@ +package com.ttstd.dialer.db.contact; + + +public interface SyncStatus { + int PENDING = 0; + int SYNCED = 1; + int FAILED = 2; + + static String getStatusName(int status) { + switch (status) { + case PENDING: + return "待同步"; + case SYNCED: + return "已同步"; + case FAILED: + return "同步失败"; + default: + return "未知状态"; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ttstd/dialer/filter/NoSpaceInputFilter.java b/app/src/main/java/com/ttstd/dialer/filter/NoSpaceInputFilter.java index b01edc5..fc98fae 100644 --- a/app/src/main/java/com/ttstd/dialer/filter/NoSpaceInputFilter.java +++ b/app/src/main/java/com/ttstd/dialer/filter/NoSpaceInputFilter.java @@ -4,18 +4,22 @@ import android.text.InputFilter; import android.text.Spanned; /** - * 过滤输入中的空格(包括普通空格和全角空格) + * 过滤输入中的空格、换行等特殊字符 */ public class NoSpaceInputFilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { - // 遍历输入的字符序列,过滤掉所有空格 + // 遍历输入的字符序列,过滤掉所有特殊字符 StringBuilder filtered = new StringBuilder(); for (int i = start; i < end; i++) { char c = source.charAt(i); - // 过滤普通空格(ASCII 32)和全角空格(Unicode 12288) - if (c != ' ' && c != '\u3000') { + // 过滤以下字符: + // 1. 普通空格(ASCII 32) + // 2. 全角空格(Unicode 12288) + // 3. 换行符(\n, \r) + // 4. 制表符(\t) + if (!Character.isWhitespace(c)) { filtered.append(c); } } diff --git a/app/src/main/java/com/ttstd/dialer/fragment/app/AppFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/app/AppFragment.java index 75e61c8..aa88802 100644 --- a/app/src/main/java/com/ttstd/dialer/fragment/app/AppFragment.java +++ b/app/src/main/java/com/ttstd/dialer/fragment/app/AppFragment.java @@ -98,7 +98,7 @@ public class AppFragment extends BaseMvvmFragment() { + mViewModel.mAppUpdateData.observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(Integer integer) { if (integer > 0) { diff --git a/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactFragment.java index 1d9d290..2016e74 100644 --- a/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactFragment.java +++ b/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactFragment.java @@ -11,7 +11,7 @@ import com.ttstd.dialer.adapter.HomeContactAdapter; import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmFragment; import com.ttstd.dialer.databinding.FragmentContactBinding; import com.ttstd.dialer.db.contact.ContactInfo; -import com.ttstd.dialer.fragment.dialog.call.CallFragment; +import com.ttstd.dialer.fragment.dialog.contact.call.CallFragment; import com.ttstd.dialer.utils.Logger; import com.ttstd.dialer.view.EqualSpaceDecoration; @@ -60,7 +60,8 @@ public class ContactFragment extends BaseMvvmFragment>() { + mViewModel.preloadData(); + mViewModel.mContactListData.observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(List contactInfos) { Logger.e(TAG, "mContactListData: " + contactInfos); diff --git a/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactViewModel.java b/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactViewModel.java index 59bbe5d..7537909 100644 --- a/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/fragment/contact/ContactViewModel.java @@ -13,18 +13,32 @@ import com.ttstd.dialer.db.contact.ContactRepository; import com.ttstd.dialer.utils.Logger; import java.util.List; +import java.util.concurrent.Callable; 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.functions.Consumer; import io.reactivex.rxjava3.schedulers.Schedulers; public class ContactViewModel extends BaseViewModel { private ContactRepository mRepository; + private boolean isDataLoaded = false; + + public void preloadData() { + if (isDataLoaded) return; + + getAllContactsObservable() + .subscribe(new Consumer>() { + @Override + public void accept(List contactInfos) throws Throwable { + mContactListData.postValue(contactInfos); + isDataLoaded = true; + } + }); + } @Override public void setContext(Context context) { @@ -34,17 +48,20 @@ public class ContactViewModel extends BaseViewModel> mContactListData = new MutableLiveData<>(); - public void getAllContacts() { - Observable.create(new ObservableOnSubscribe>() { - @Override - public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { - List contactInfos = mRepository.getAllContacts(); - emitter.onNext(contactInfos); - emitter.onComplete(); - } - }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) + public Observable> getAllContactsObservable() { + return Observable.fromCallable(new Callable>() { + @Override + public List call() throws Exception { + List contactInfos = mRepository.getAllContacts(); + return contactInfos; + } + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.STOP)) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public void getAllContacts() { + getAllContactsObservable() .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallViewModel.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallViewModel.java deleted file mode 100644 index fa7ccef..0000000 --- a/app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallViewModel.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ttstd.dialer.fragment.dialog.call; - -import com.trello.rxlifecycle4.android.FragmentEvent; -import com.ttstd.dialer.base.mvvm.BaseViewModel; -import com.ttstd.dialer.databinding.FragmentCallBinding; - -public class CallViewModel extends BaseViewModel { - - -} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/call/CallFragment.java similarity index 96% rename from app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallFragment.java rename to app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/call/CallFragment.java index f9494e9..bebe2f3 100644 --- a/app/src/main/java/com/ttstd/dialer/fragment/dialog/call/CallFragment.java +++ b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/call/CallFragment.java @@ -1,4 +1,4 @@ -package com.ttstd.dialer.fragment.dialog.call; +package com.ttstd.dialer.fragment.dialog.contact.call; import android.Manifest; import android.app.Activity; @@ -23,14 +23,14 @@ import androidx.fragment.app.FragmentTransaction; import com.hjq.toast.Toaster; import com.ttstd.dialer.R; import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmDialogFragment; -import com.ttstd.dialer.databinding.FragmentCallBinding; +import com.ttstd.dialer.databinding.DialogFragmentContactCallBinding; import com.ttstd.dialer.db.contact.ContactInfo; import com.ttstd.dialer.service.DialerAccessibilityService; import com.ttstd.dialer.utils.AccessibilityServiceHelper; import com.ttstd.dialer.utils.ApkUtils; import com.ttstd.dialer.utils.Logger; -public class CallFragment extends BaseMvvmDialogFragment { +public class CallFragment extends BaseMvvmDialogFragment { private static final String TAG = "CallFragment"; private static final int REQUEST_CODE_CALL = 7897; @@ -47,7 +47,7 @@ public class CallFragment extends BaseMvvmDialogFragment { + + +} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteDialogFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteDialogFragment.java new file mode 100644 index 0000000..77d516e --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteDialogFragment.java @@ -0,0 +1,131 @@ +package com.ttstd.dialer.fragment.dialog.contact.delete; + +import android.app.Activity; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.hjq.toast.Toaster; +import com.ttstd.dialer.R; +import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmDialogFragment; +import com.ttstd.dialer.databinding.DialogFragmentDeleteContactBinding; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.utils.AvatarCacheUtil; +import com.ttstd.dialer.utils.GlideUtils; +import com.ttstd.dialer.utils.Logger; + +public class ContactDeleteDialogFragment extends BaseMvvmDialogFragment { + + private static final String TAG = "EditDialogFragment"; + private Activity mContext; + private ContactInfo mContactInfo; + + public interface ContactOperationListener { + void onCancel(ContactInfo contactInfo); + + void onDelete(ContactInfo contactInfo); + } + + private ContactOperationListener mContactOperationListener; + + public void setContactOperateListener(ContactOperationListener contactOperationListener) { + mContactOperationListener = contactOperationListener; + } + + public ContactDeleteDialogFragment(ContactInfo contactInfo) { + mContactInfo = contactInfo; + } + + @Override + protected int getLayoutId() { + return R.layout.dialog_fragment_delete_contact; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setContext(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView(Bundle bundle) { + if (mContactInfo != null) { + mViewDataBinding.setContactInfo(mContactInfo); + GlideUtils.loadImageSafe(mContext, mContactInfo.getAvatar(), mViewDataBinding.contactAvatar, AvatarCacheUtil.getAvatar(mContext, mContactInfo.getName())); + } else { + Toaster.show("无联系人信息"); + dismiss(); + } + } + + @Override + protected void initData(Bundle savedInstanceState) { + + } + + @Override + public void fetchData() { + + } + + @Override + public void onStart() { + super.onStart(); + if (getDialog() != null) { + Window window = getDialog().getWindow(); + if (window == null) return; + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.WRAP_CONTENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.CENTER; + window.setAttributes(params); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + getDialog().setCancelable(true); + getDialog().setCanceledOnTouchOutside(true); + } + } + + @Override + public void show(FragmentManager manager, String tag) { + DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag); + if (fragment != null && fragment.isAdded() + && fragment.getDialog() != null && fragment.getDialog().isShowing()) { + return; + } + + try { + FragmentTransaction ft = manager.beginTransaction(); + ft.add(this, tag); + ft.commitAllowingStateLoss(); + } catch (Exception e) { + Logger.e(TAG, "show: " + e.getMessage()); + } + } + + public class BtnClick { + public void onCancel(View view) { + if (mContactOperationListener != null) { + mContactOperationListener.onCancel(mContactInfo); + } + dismiss(); + } + + public void onDelete(View view) { + if (mContactOperationListener != null) { + mContactOperationListener.onDelete(mContactInfo); + } + dismiss(); + } + } +} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteViewModel.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteViewModel.java new file mode 100644 index 0000000..8e3bf2b --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/delete/ContactDeleteViewModel.java @@ -0,0 +1,8 @@ +package com.ttstd.dialer.fragment.dialog.contact.delete; + +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.ttstd.dialer.base.mvvm.BaseViewModel; +import com.ttstd.dialer.databinding.DialogFragmentDeleteContactBinding; + +public class ContactDeleteViewModel extends BaseViewModel { +} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditDialogFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditDialogFragment.java new file mode 100644 index 0000000..d083690 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditDialogFragment.java @@ -0,0 +1,131 @@ +package com.ttstd.dialer.fragment.dialog.contact.edit; + +import android.app.Activity; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.hjq.toast.Toaster; +import com.ttstd.dialer.R; +import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmDialogFragment; +import com.ttstd.dialer.databinding.DialogFragmentEditContactBinding; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.utils.AvatarCacheUtil; +import com.ttstd.dialer.utils.GlideUtils; +import com.ttstd.dialer.utils.Logger; + +public class EditDialogFragment extends BaseMvvmDialogFragment { + + private static final String TAG = "EditDialogFragment"; + private Activity mContext; + private ContactInfo mContactInfo; + + public interface ContactOperationListener { + void onContactEdit(ContactInfo contactInfo); + + void onContactDelete(ContactInfo contactInfo); + } + + private ContactOperationListener mContactOperationListener; + + public void setContactOperateListener(ContactOperationListener contactOperationListener) { + mContactOperationListener = contactOperationListener; + } + + public EditDialogFragment(ContactInfo contactInfo) { + mContactInfo = contactInfo; + } + + @Override + protected int getLayoutId() { + return R.layout.dialog_fragment_edit_contact; + } + + @Override + protected void initDataBinding() { + mContext = getActivity(); + mViewModel.setContext(mContext); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView(Bundle bundle) { + if (mContactInfo != null) { + mViewDataBinding.setContactInfo(mContactInfo); + GlideUtils.loadImageSafe(mContext, mContactInfo.getAvatar(), mViewDataBinding.contactAvatar, AvatarCacheUtil.getAvatar(mContext, mContactInfo.getName())); + } else { + Toaster.show("无联系人信息"); + dismiss(); + } + } + + @Override + protected void initData(Bundle savedInstanceState) { + + } + + @Override + public void fetchData() { + + } + + @Override + public void onStart() { + super.onStart(); + if (getDialog() != null) { + Window window = getDialog().getWindow(); + if (window == null) return; + WindowManager.LayoutParams params = window.getAttributes(); + params.width = WindowManager.LayoutParams.WRAP_CONTENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.gravity = Gravity.CENTER; + window.setAttributes(params); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + getDialog().setCancelable(true); + getDialog().setCanceledOnTouchOutside(true); + } + } + + @Override + public void show(FragmentManager manager, String tag) { + DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag); + if (fragment != null && fragment.isAdded() + && fragment.getDialog() != null && fragment.getDialog().isShowing()) { + return; + } + + try { + FragmentTransaction ft = manager.beginTransaction(); + ft.add(this, tag); + ft.commitAllowingStateLoss(); + } catch (Exception e) { + Logger.e(TAG, "show: " + e.getMessage()); + } + } + + public class BtnClick { + public void onEditContact(View view) { + if (mContactOperationListener != null) { + mContactOperationListener.onContactEdit(mContactInfo); + } + dismiss(); + } + + public void onDeleteContact(View view) { + if (mContactOperationListener != null) { + mContactOperationListener.onContactDelete(mContactInfo); + } + dismiss(); + } + } +} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditViewModel.java b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditViewModel.java new file mode 100644 index 0000000..1bc7202 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/fragment/dialog/contact/edit/EditViewModel.java @@ -0,0 +1,8 @@ +package com.ttstd.dialer.fragment.dialog.contact.edit; + +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.ttstd.dialer.base.mvvm.BaseViewModel; +import com.ttstd.dialer.databinding.DialogFragmentEditContactBinding; + +public class EditViewModel extends BaseViewModel { +} diff --git a/app/src/main/java/com/ttstd/dialer/fragment/home/HomeFragment.java b/app/src/main/java/com/ttstd/dialer/fragment/home/HomeFragment.java index 57adcc1..4cec410 100644 --- a/app/src/main/java/com/ttstd/dialer/fragment/home/HomeFragment.java +++ b/app/src/main/java/com/ttstd/dialer/fragment/home/HomeFragment.java @@ -8,21 +8,32 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.provider.Settings; +import android.text.TextUtils; import android.view.View; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; import com.hjq.toast.Toaster; +import com.jeremyliao.liveeventbus.LiveEventBus; +import com.qweather.sdk.response.weather.WeatherDaily; import com.ttstd.dialer.R; import com.ttstd.dialer.activity.contact.list.ContactListActivity; import com.ttstd.dialer.activity.weather.main.WeatherMainActivity; import com.ttstd.dialer.base.mvvm.fragment.BaseMvvmFragment; +import com.ttstd.dialer.bean.req.SnLocationReq; +import com.ttstd.dialer.config.CommonConfig; import com.ttstd.dialer.databinding.FragmentHomeBinding; +import com.ttstd.dialer.manager.WeatherUpdateManager; import com.ttstd.dialer.utils.ApkUtils; import com.ttstd.dialer.utils.DateUtil; import com.ttstd.dialer.utils.Logger; import com.ttstd.dialer.utils.LunarCalendarFestivalUtils; +import kotlinx.coroutines.CoroutineScope; +import kotlinx.coroutines.CoroutineScopeKt; +import kotlinx.coroutines.Job; + /** * A simple {@link Fragment} subclass. * Use the {@link HomeFragment#newInstance} factory method to @@ -33,6 +44,12 @@ public class HomeFragment extends BaseMvvmFragment() { + @Override + public void onChanged(SnLocationReq snLocationReq) { + mViewDataBinding.tvLocation.setText(snLocationReq.getDistrict()); + } + }); } @Override @@ -118,6 +143,58 @@ public class HomeFragment extends BaseMvvmFragment { + if (weatherNowResponse != null) { + Logger.e(TAG, "observeWeatherUpdates", "weatherNowResponse = " + weatherNowResponse); + mViewDataBinding.tvWeather.setText(weatherNowResponse.getNow().getText()); + } + + return null; + }); + + weatherHourlyJob = weatherUpdateManager.observeWeatherHourly(weatherScope, weatherHourlyResponse -> { + if (weatherHourlyResponse != null) { + Logger.e(TAG, "observeWeatherUpdates", "weatherHourlyResponse = " + weatherHourlyResponse); + } + return null; + }); + + weatherDailyJob = weatherUpdateManager.observeWeatherDaily(weatherScope, weatherDailyResponse -> { + if (weatherDailyResponse != null) { + Logger.e(TAG, "observeWeatherUpdates", "weatherDailyResponse = " + weatherDailyResponse); + + WeatherDaily weatherDaily = weatherDailyResponse.getDaily().get(0); + String iconDay = weatherDaily.getIconDay(); + // 获取资源ID + String fileName = "qweather_" + iconDay; // 替换为你的文件名 + int resId = mContext.getResources().getIdentifier(fileName, "raw", mContext.getPackageName()); + if (resId != 0) { + mViewDataBinding.ivQweatherIcon.setImageDrawable(mContext.getDrawable(resId)); + } else { + // 处理错误 + Logger.e("GlideLoad", "Raw resource not found: " + fileName); + } + } + return null; + }); + } + public void registerReceivers() { registerTimeReceiver(); } @@ -152,14 +229,16 @@ public class HomeFragment extends BaseMvvmFragment DEFAULT_APP_PACKAGES = new ArrayList() {{ - this.add("com.android.settings"); this.add("com.android.dialer"); - this.add("com.android.camera2"); - this.add("com.android.messaging"); this.add("com.android.contacts"); + this.add("com.android.messaging"); + this.add("com.android.settings"); + this.add("com.android.camera2"); + this.add("com.tencent.mm"); this.add("com.jiangjia.gif"); this.add("com.ss.android.ugc.aweme"); diff --git a/app/src/main/java/com/ttstd/dialer/manager/ContactManager.java b/app/src/main/java/com/ttstd/dialer/manager/ContactManager.java new file mode 100644 index 0000000..25c6db8 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/manager/ContactManager.java @@ -0,0 +1,322 @@ +package com.ttstd.dialer.manager; + +import android.content.Context; +import android.util.Log; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.ttstd.dialer.bean.BaseResponse; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.db.contact.ContactRepository; +import com.ttstd.dialer.network.BaseObserver; +import com.ttstd.dialer.network.OkHttpManager; +import com.ttstd.dialer.utils.Logger; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +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; +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public class ContactManager { + private static final String TAG = "ContactManager"; + private static volatile ContactManager instance; + + private ContactRepository mRepository; + private Context mContext; + + // 同步状态常量 + private static final int SYNC_STATUS_SYNCED = 1; // 已同步 + private static final int SYNC_STATUS_UNSYNCED = 0; // 未同步 + private static final int SYNC_STATUS_DELETED = 2; // 已删除(待同步删除) + + private ContactManager(Context context) { + this.mContext = context.getApplicationContext(); + this.mRepository = new ContactRepository(mContext); + } + + public static ContactManager getInstance(Context context) { + if (instance == null) { + synchronized (ContactManager.class) { + if (instance == null) { + instance = new ContactManager(context); + } + } + } + return instance; + } + + /** + * 获取联系人列表(优先从网络获取,失败则从本地数据库获取) + * + * @param lifecycle RxLifecycle 生命周期绑定 + * @param callback 回调接口 + */ + public void getContacts(BehaviorSubject lifecycle, ContactCallback callback) { + Logger.e(TAG, "开始获取联系人列表"); + + OkHttpManager.getInstance().getContactListObservable(lifecycle) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(BaseResponse> listBaseResponse) { + Log.e(TAG, "网络请求成功: " + listBaseResponse); + if (listBaseResponse.isSuccess()) { + List networkContacts = listBaseResponse.getData(); + if (networkContacts != null && !networkContacts.isEmpty()) { + // 在子线程中处理数据库同步 + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + try { + // 同步网络和本地数据 + syncContacts(networkContacts); + // 返回排序后的联系人列表 + List sortedContacts = networkContacts.stream() + .sorted((c1, c2) -> Integer.compare(c1.getPosition(), c2.getPosition())) + .collect(Collectors.toList()); + emitter.onNext(sortedContacts); + emitter.onComplete(); + } catch (Exception e) { + emitter.onError(e); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Logger.e(TAG, "开始处理联系人数据"); + } + + @Override + public void onNext(@NonNull List contactInfos) { + Logger.e(TAG, "联系人数据处理完成,数量: " + contactInfos.size()); + if (callback != null) { + callback.onSuccess(contactInfos); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Logger.e(TAG, "处理联系人数据失败: " + e.getMessage()); + if (callback != null) { + callback.onFailure(e); + } + } + + @Override + public void onComplete() { + Logger.e(TAG, "联系人数据处理完成"); + } + }); + } else { + // 网络返回空数据,从本地获取 + getLocalContacts(callback); + } + } else { + // 网络请求业务失败,从本地获取 + getLocalContacts(callback); + } + } + + @Override + public void onFailure(Throwable e) { + Log.e(TAG, "网络请求失败: " + e.getMessage()); + // 网络请求失败,从本地获取 + getLocalContacts(callback); + } + }); + } + + /** + * 从本地数据库获取联系人 + */ + private void getLocalContacts(ContactCallback callback) { + Logger.e(TAG, "从本地数据库获取联系人"); + + Observable.create(new ObservableOnSubscribe>() { + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + try { + List localContacts = mRepository.getAllContacts(); + List sortedContacts = localContacts.stream() + .sorted((c1, c2) -> Integer.compare(c1.getPosition(), c2.getPosition())) + .collect(Collectors.toList()); + emitter.onNext(sortedContacts); + emitter.onComplete(); + } catch (Exception e) { + emitter.onError(e); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Logger.e(TAG, "开始获取本地联系人"); + } + + @Override + public void onNext(@NonNull List contactInfos) { + Logger.e(TAG, "获取本地联系人成功,数量: " + contactInfos.size()); + if (callback != null) { + callback.onSuccess(contactInfos); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Logger.e(TAG, "获取本地联系人失败: " + e.getMessage()); + if (callback != null) { + callback.onFailure(e); + } + } + + @Override + public void onComplete() { + Logger.e(TAG, "获取本地联系人完成"); + } + }); + } + + /** + * 同步网络和本地联系人数据(增删改查对比) + * + * @param networkContacts 网络联系人列表 + */ + private void syncContacts(List networkContacts) { + Logger.e(TAG, "开始同步联系人数据"); + + // 获取本地所有联系人 + List localContacts = mRepository.getAllContacts(); + + // 创建 Map 以便快速查找 + // 网络联系人:以 id 为 key + Map networkMap = new HashMap<>(); + for (ContactInfo networkContact : networkContacts) { + networkMap.put(networkContact.getId(), networkContact); + } + + // 本地联系人:以 id 为 key + Map localMap = new HashMap<>(); + for (ContactInfo localContact : localContacts) { + localMap.put(localContact.getId(), localContact); + } + + Logger.e(TAG, "网络联系人数量: " + networkMap.size() + ", 本地联系人数量: " + localMap.size()); + + // 1. 处理新增和更新:遍历网络联系人 + for (ContactInfo networkContact : networkContacts) { + ContactInfo localContact = localMap.get(networkContact.getId()); + + if (localContact == null) { + // 本地不存在,需要新增 + Logger.e(TAG, "新增联系人: " + networkContact.getName()); + networkContact.setSyncStatus(SYNC_STATUS_SYNCED); + networkContact.setLocalId(null); + mRepository.insert(networkContact); + } else { + // 本地存在,检查是否需要更新(比较 updateTime) + if (networkContact.getUpdateTime() > localContact.getUpdateTime()) { + Logger.e(TAG, "更新联系人: " + networkContact.getName()); + networkContact.setSyncStatus(SYNC_STATUS_SYNCED); + networkContact.setLocalId(localContact.getLocalId()); + mRepository.update(networkContact); + } else { + Logger.e(TAG, "联系人无变化: " + networkContact.getName()); + } + } + } + + // 2. 处理删除:遍历本地联系人,找出网络中不存在的 + for (ContactInfo localContact : localContacts) { + if (!networkMap.containsKey(localContact.getId())) { + if (localContact.getSyncStatus() == SYNC_STATUS_SYNCED) { + Logger.e(TAG, "删除联系人: " + localContact.getName()); + mRepository.delete(localContact); + } else { + Logger.e(TAG, "联系人未同步,不删除: " + localContact.getName()); + } + } + } + + Logger.e(TAG, "联系人同步完成"); + } + + public void compareContacts(List networkContacts, List localContacts) { + Logger.e(TAG, "开始比较联系人数据"); + + // 创建 Map 以便快速查找 + // 网络联系人:以 id 为 key + Map networkMap = new HashMap<>(); + for (ContactInfo networkContact : networkContacts) { + networkMap.put(networkContact.getId(), networkContact); + } + + // 本地联系人:以 id 为 key + Map localMap = new HashMap<>(); + for (ContactInfo localContact : localContacts) { + localMap.put(localContact.getId(), localContact); + } + + Logger.e(TAG, "网络联系人数量: " + networkMap.size() + ", 本地联系人数量: " + localMap.size()); + + // 1. 处理新增和更新:遍历网络联系人 + for (ContactInfo networkContact : networkContacts) { + ContactInfo localContact = localMap.get(networkContact.getId()); + + if (localContact == null) { + // 本地不存在,需要新增 + Logger.e(TAG, "新增联系人: " + networkContact.getName()); + networkContact.setSyncStatus(SYNC_STATUS_SYNCED); + networkContact.setLocalId(null); +// mRepository.insert(networkContact); + } else { + // 本地存在,检查是否需要更新(比较 updateTime) + if (networkContact.getUpdateTime() > localContact.getUpdateTime()) { + Logger.e(TAG, "更新联系人: " + networkContact.getName()); + networkContact.setSyncStatus(SYNC_STATUS_SYNCED); + networkContact.setLocalId(localContact.getLocalId()); +// mRepository.update(networkContact); + } else { + Logger.e(TAG, "联系人无变化: " + networkContact.getName()); + } + } + } + + // 2. 处理删除:遍历本地联系人,找出网络中不存在的 + for (ContactInfo localContact : localContacts) { + if (!networkMap.containsKey(localContact.getId())) { + if (localContact.getSyncStatus() == SYNC_STATUS_SYNCED) { + Logger.e(TAG, "删除联系人: " + localContact.getName()); +// mRepository.delete(localContact); + } else { + Logger.e(TAG, "联系人未同步,不删除: " + localContact.getName()); + } + } + } + + Logger.e(TAG, "联系人比较完成"); + } + + /** + * 联系人回调接口 + */ + public interface ContactCallback { + void onSuccess(List contacts); + + void onFailure(Throwable e); + } +} diff --git a/app/src/main/java/com/ttstd/dialer/manager/ContactSyncManager.java b/app/src/main/java/com/ttstd/dialer/manager/ContactSyncManager.java new file mode 100644 index 0000000..fbaad48 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/manager/ContactSyncManager.java @@ -0,0 +1,95 @@ +package com.ttstd.dialer.manager; + +import android.content.Context; + +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.db.contact.ContactRepository; +import com.ttstd.dialer.db.contact.SyncStatus; +import com.ttstd.dialer.network.OkHttpManager; +import com.ttstd.dialer.utils.Logger; + +import java.util.List; + +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.disposables.CompositeDisposable; +import io.reactivex.rxjava3.schedulers.Schedulers; + +public class ContactSyncManager { + private static final String TAG = "ContactSyncManager"; + private static volatile ContactSyncManager INSTANCE; + + private ContactRepository mRepository; + private CompositeDisposable mDisposable; + + private ContactSyncManager(Context context) { + mRepository = new ContactRepository(context); + mDisposable = new CompositeDisposable(); + } + + public static ContactSyncManager getInstance(Context context) { + if (INSTANCE == null) { + synchronized (ContactSyncManager.class) { + if (INSTANCE == null) { + INSTANCE = new ContactSyncManager(context.getApplicationContext()); + } + } + } + return INSTANCE; + } + + public void syncPendingContacts() { + Observable.fromCallable(() -> { + List pendingContacts = mRepository.getUnsyncedContacts(); + Logger.d(TAG, "查询到 " + pendingContacts.size() + " 个待同步联系人"); + return pendingContacts; + }) + .subscribeOn(Schedulers.io()) + .flatMapIterable(pendingContacts -> pendingContacts) + .subscribeOn(Schedulers.io()) + .flatMap(contactInfo -> syncSingleContactObservable(contactInfo)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + result -> Logger.d(TAG, "同步完成: " + result), + throwable -> Logger.e(TAG, "同步流程异常: " + throwable.getMessage()) + ); + } + + private Observable syncSingleContactObservable(ContactInfo contactInfo) { + return OkHttpManager.getInstance().getContactInsertObservable(contactInfo) + .subscribeOn(Schedulers.io()) + .flatMap(baseResponse -> { + if (baseResponse.isSuccess()) { + Long onlineId = baseResponse.getData(); + return saveSuccessSyncStatus(contactInfo.getId(), onlineId) + .map(v -> "成功: " + contactInfo.getName()); + } else { + return saveFailedSyncStatus(contactInfo.getId()) + .flatMap(v -> Observable.error(new Exception("业务失败: " + baseResponse.getMsg()))); + } + }) + .onErrorResumeNext(throwable -> { + return saveFailedSyncStatus(contactInfo.getId()) + .map(v -> "失败: " + contactInfo.getName()); + }); + } + + private Observable saveSuccessSyncStatus(long contactId, Long onlineId) { + return Observable.fromAction(() -> { + mRepository.updateSyncStatus(contactId, SyncStatus.SYNCED, onlineId, System.currentTimeMillis()); + }).subscribeOn(Schedulers.io()); + } + + private Observable saveFailedSyncStatus(long contactId) { + return Observable.fromAction(() -> { + mRepository.updateSyncStatusById(contactId, SyncStatus.FAILED); + }).subscribeOn(Schedulers.io()); + } + + public void dispose() { + if (!mDisposable.isDisposed()) { + mDisposable.dispose(); + } + } +} diff --git a/app/src/main/java/com/ttstd/dialer/manager/MapManager.java b/app/src/main/java/com/ttstd/dialer/manager/MapManager.java index ad0c41a..905f63f 100644 --- a/app/src/main/java/com/ttstd/dialer/manager/MapManager.java +++ b/app/src/main/java/com/ttstd/dialer/manager/MapManager.java @@ -18,8 +18,8 @@ import com.tencent.mmkv.MMKV; import com.ttstd.dialer.bean.req.SnLocationReq; import com.ttstd.dialer.config.CommonConfig; import com.ttstd.dialer.gson.GsonUtils; +import com.ttstd.dialer.mdm.DeviceManagerService; import com.ttstd.dialer.utils.Logger; -import com.ttstd.dialer.utils.SystemUtils; import java.math.BigDecimal; import java.util.LinkedHashMap; @@ -258,7 +258,7 @@ public class MapManager { mMMKV.encode("MapError", "-"); Map params = new LinkedHashMap<>(); - params.put("sn", SystemUtils.getSerial()); + params.put("sn", DeviceManagerService.getInstance().getSerial()); params.put("address", bdLocation.getAddrStr()); params.put("location_describe", bdLocation.getLocationDescribe()); params.put("longitude", bdLocation.getLongitude()); diff --git a/app/src/main/java/com/ttstd/dialer/manager/WeatherManager.java b/app/src/main/java/com/ttstd/dialer/manager/WeatherManager.java index 46fbf9b..dae59f5 100644 --- a/app/src/main/java/com/ttstd/dialer/manager/WeatherManager.java +++ b/app/src/main/java/com/ttstd/dialer/manager/WeatherManager.java @@ -15,9 +15,11 @@ import com.qweather.sdk.response.error.ErrorResponse; import com.qweather.sdk.response.weather.WeatherDailyResponse; import com.qweather.sdk.response.weather.WeatherHourlyResponse; import com.qweather.sdk.response.weather.WeatherNowResponse; +import com.tencent.mmkv.MMKV; import com.ttstd.dialer.BuildConfig; import com.ttstd.dialer.bean.CityInfo; import com.ttstd.dialer.config.CommonConfig; +import com.ttstd.dialer.gson.GsonUtils; import com.ttstd.dialer.utils.Logger; import com.ttstd.dialer.utils.NativeUtils; @@ -34,26 +36,30 @@ import io.reactivex.rxjava3.core.ObservableOnSubscribe; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; -import kotlinx.coroutines.CoroutineScope; -import kotlinx.coroutines.CoroutineStart; -import kotlinx.coroutines.Dispatchers; -import kotlinx.coroutines.GlobalScope; public class WeatherManager { private static final String TAG = "WeatherManager"; + private static final String WEATHER_NOW_CACHE = "weather_now_cache_key"; + private static final String WEATHER_24_HOUR_CACHE = "weather_24_hour_cache"; + private static final String WEATHER_10_DAY_CACHE = "weather_10_day_cache"; + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + @SuppressLint("StaticFieldLeak") - private static WeatherManager INSTANCE; + private static volatile WeatherManager INSTANCE; private Context mContext; private QWeather mQWeather; private Map LocationIDMap = new HashMap<>(); private boolean loadCsvFinish = false; private String mAdCode; - private WeatherUpdateManager weatherUpdateManager; + private String mLocationId; + private WeatherUpdateManager mWeatherUpdateManager; private WeatherManager(Context context) { this.mContext = context.getApplicationContext(); - weatherUpdateManager = WeatherUpdateManager.Companion.getInstance(); + mWeatherUpdateManager = WeatherUpdateManager.Companion.getInstance(); + mAdCode = mMMKV.decodeString(CommonConfig.CURRENT_LOCATION_AD_CODE_KEY, ""); initCsv(); try { // 通过SDK提供的JWTGenerator设置令牌生成器,其实现自TokenGenerator接口 @@ -67,11 +73,29 @@ public class WeatherManager { Logger.e(TAG, "QWeatherUtils: " + e.getMessage()); e.printStackTrace(); } + + WeatherNowResponse weatherNowResponse = getWeatherNowCache(); + if (weatherNowResponse != null) { + mWeatherUpdateManager.publishWeatherNowUpdate(weatherNowResponse); + + } + WeatherHourlyResponse weatherHourlyResponse = getWeather24hCache(); + if (weatherHourlyResponse != null) { + mWeatherUpdateManager.publishWeatherHourlyUpdate(weatherHourlyResponse); + } + WeatherDailyResponse weatherDailyResponse = getWeather10DCache(); + if (weatherDailyResponse != null) { + mWeatherUpdateManager.publishWeatherDailyUpdate(weatherDailyResponse); + } } public static void init(Context context) { if (INSTANCE == null) { - INSTANCE = new WeatherManager(context); + synchronized (WeatherManager.class) { + if (INSTANCE == null) { + INSTANCE = new WeatherManager(context); + } + } } } @@ -98,16 +122,20 @@ public class WeatherManager { } } + public String getAdCode() { + return mAdCode; + } + private void initCsv() { Observable.create(new ObservableOnSubscribe>() { - @Override - public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { - long time = System.currentTimeMillis(); - List cityInfos = CsvDeserializer.deserializeFromAssets(mContext, "China-City-List-latest.csv"); - Logger.e(TAG, "subscribe: deserializeFromAssets time = " + (System.currentTimeMillis() - time) + "ms"); - emitter.onNext(cityInfos); - } - }) + @Override + public void subscribe(@NonNull ObservableEmitter> emitter) throws Throwable { + long time = System.currentTimeMillis(); + List cityInfos = CsvDeserializer.deserializeFromAssets(mContext, "China-City-List-latest.csv"); + Logger.e(TAG, "subscribe: deserializeFromAssets time = " + (System.currentTimeMillis() - time) + "ms"); + emitter.onNext(cityInfos); + } + }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer>() { @@ -155,9 +183,19 @@ public class WeatherManager { return ""; } - public void getWeatherNow(String adCode, Callback callback) { + public void refreshweather() { + if (!TextUtils.isEmpty(mAdCode)) { + + } + } + + public void getWeatherNowAdCode(String adCode, Callback callback) { String locationID = getLocationID(adCode); - Logger.e(TAG, "getWeatherNow: locationID = " + locationID); + Logger.e(TAG, "getWeatherNowAdCode: locationID = " + locationID); + getWeatherNow(locationID, callback); + } + + public void getWeatherNow(String locationID, Callback callback) { WeatherParameter parameter = new WeatherParameter(locationID) .lang(Lang.ZH_HANS) .unit(Unit.METRIC); @@ -165,7 +203,9 @@ public class WeatherManager { @Override public void onSuccess(WeatherNowResponse weatherNowResponse) { Logger.e(TAG, "getWeatherNow", "onSuccess: " + weatherNowResponse); - weatherUpdateManager.publishWeatherNowUpdate(weatherNowResponse); + mWeatherUpdateManager.publishWeatherNowUpdate(weatherNowResponse); + mMMKV.encode(WEATHER_NOW_CACHE, GsonUtils.toJSONString(weatherNowResponse)); + if (callback != null) { callback.onSuccess(weatherNowResponse); } @@ -187,17 +227,23 @@ public class WeatherManager { }); } - public void getWeather24h(String adCode, Callback callback) { + public void getWeather24HourAdCode(String adCode, Callback callback) { String locationID = getLocationID(adCode); - Logger.e(TAG, "getWeatherNow: locationID = " + locationID); + Logger.e(TAG, "getWeather24HourAdCode: locationID = " + locationID); + getWeather24Hour(locationID, callback); + } + + public void getWeather24Hour(String locationID, Callback callback) { WeatherParameter parameter = new WeatherParameter(locationID) .lang(Lang.ZH_HANS) .unit(Unit.METRIC); mQWeather.weather24h(parameter, new Callback() { @Override public void onSuccess(WeatherHourlyResponse weatherHourlyResponse) { - Logger.e(TAG, "getWeather24h", "onSuccess: " + weatherHourlyResponse); - weatherUpdateManager.publishWeatherHourlyUpdate(weatherHourlyResponse); + Logger.e(TAG, "getWeather24Hour", "onSuccess: " + weatherHourlyResponse); + mWeatherUpdateManager.publishWeatherHourlyUpdate(weatherHourlyResponse); + mMMKV.encode(WEATHER_24_HOUR_CACHE, GsonUtils.toJSONString(weatherHourlyResponse)); + if (callback != null) { callback.onSuccess(weatherHourlyResponse); } @@ -219,17 +265,23 @@ public class WeatherManager { }); } - public void getWeather10D(String adCode, Callback callback) { + public void getWeather10DayAdCode(String adCode, Callback callback) { String locationID = getLocationID(adCode); - Logger.e(TAG, "getWeather10D: locationID = " + locationID); + Logger.e(TAG, "getWeather10Day: locationID = " + locationID); + getWeather10Day(locationID, callback); + } + + public void getWeather10Day(String locationID, Callback callback) { WeatherParameter parameter = new WeatherParameter(locationID) .lang(Lang.ZH_HANS) .unit(Unit.METRIC); mQWeather.weather10d(parameter, new Callback() { @Override public void onSuccess(WeatherDailyResponse weatherDailyResponse) { - Logger.e(TAG, "getWeather10D", "onSuccess: " + weatherDailyResponse); - weatherUpdateManager.publishWeatherDailyUpdate(weatherDailyResponse); + Logger.e(TAG, "getWeather10Day", "onSuccess: " + weatherDailyResponse); + mWeatherUpdateManager.publishWeatherDailyUpdate(weatherDailyResponse); + mMMKV.encode(WEATHER_10_DAY_CACHE, GsonUtils.toJSONString(weatherDailyResponse)); + if (callback != null) { callback.onSuccess(weatherDailyResponse); } @@ -251,5 +303,28 @@ public class WeatherManager { }); } + public WeatherNowResponse getWeatherNowCache() { + String weatherNowCache = mMMKV.decodeString(WEATHER_NOW_CACHE); + if (!TextUtils.isEmpty(weatherNowCache)) { + return GsonUtils.toJavaObject(weatherNowCache, WeatherNowResponse.class); + } + return null; + } + + public WeatherHourlyResponse getWeather24hCache() { + String weather24hCache = mMMKV.decodeString(WEATHER_24_HOUR_CACHE); + if (!TextUtils.isEmpty(weather24hCache)) { + return GsonUtils.toJavaObject(weather24hCache, WeatherHourlyResponse.class); + } + return null; + } + + public WeatherDailyResponse getWeather10DCache() { + String weather10DCache = mMMKV.decodeString(WEATHER_10_DAY_CACHE); + if (!TextUtils.isEmpty(weather10DCache)) { + return GsonUtils.toJavaObject(weather10DCache, WeatherDailyResponse.class); + } + return null; + } } diff --git a/app/src/main/java/com/ttstd/dialer/network/OkHttpManager.java b/app/src/main/java/com/ttstd/dialer/network/OkHttpManager.java index d319f1d..c044493 100644 --- a/app/src/main/java/com/ttstd/dialer/network/OkHttpManager.java +++ b/app/src/main/java/com/ttstd/dialer/network/OkHttpManager.java @@ -13,15 +13,18 @@ import com.ttstd.dialer.bean.BaseResponse; import com.ttstd.dialer.bean.DeveloperOptions; import com.ttstd.dialer.bean.req.SnHardwareInfoReq; import com.ttstd.dialer.bean.req.SnLocationReq; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.mdm.DeviceManagerService; +import com.ttstd.dialer.network.api.ContactApi; import com.ttstd.dialer.network.api.SnApi; import com.ttstd.dialer.network.interceptor.AuthInterceptor; import com.ttstd.dialer.utils.FileUtils; import com.ttstd.dialer.utils.Logger; -import com.ttstd.dialer.utils.SystemUtils; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.List; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -48,7 +51,7 @@ public class OkHttpManager { private static final String TAG = "OkHttpManager"; // 超时时间(抽成常量,便于统一维护) - private static final int DEFAULT_TIMEOUT_SECONDS = 5; + private static final int DEFAULT_TIMEOUT_SECONDS = 30; // 缓存大小 64MB(使用更语义化的命名) private static final long CACHE_SIZE_BYTES = 1024 * 1024 * 64L; // 缓存目录名称(避免硬编码) @@ -296,6 +299,10 @@ public class OkHttpManager { .compose(RxLifecycle.bindUntilEvent(provider, ActivityEvent.DESTROY)); } + public T getApiService(Class tClass) { + return mRetrofit.create(tClass); + } + public Observable schedule(Observable observable) { return observable // 子线程执行请求 @@ -305,36 +312,61 @@ public class OkHttpManager { } public Observable getSnRegisterObservable(BehaviorSubject provider) { - return schedule(mRetrofit.create(SnApi.class).register(SystemUtils.getSerial(), Build.MODEL), provider); + return schedule(getApiService(SnApi.class).register(DeviceManagerService.getInstance().getSerial(), Build.MODEL), provider); } public Observable> getUpdateHardwareInfoObservable(SnHardwareInfoReq snHardwareInfoReq) { RequestBody body = convertToRequestBodyjson(snHardwareInfoReq); - return schedule(mRetrofit.create(SnApi.class).updateHardwareInfo(body)); + return schedule(getApiService(SnApi.class).updateHardwareInfo(body)); } public Observable getUploadScreenshotObservable(MultipartBody.Part part) { - return schedule(mRetrofit.create(SnApi.class).uploadScreenshot(part)); + return schedule(getApiService(SnApi.class).uploadScreenshot(part)); } public Observable getUploadLocationObservable(SnLocationReq locationReq, BehaviorSubject provider) { - return schedule(mRetrofit.create(SnApi.class).uploadLocation(convertToRequestBodyjson(locationReq)), provider); + return schedule(getApiService(SnApi.class).uploadLocation(convertToRequestBodyjson(locationReq)), provider); } public Observable getUploadLocationObservable(SnLocationReq locationReq) { - return schedule(mRetrofit.create(SnApi.class).uploadLocation(convertToRequestBodyjson(locationReq))); + return schedule(getApiService(SnApi.class).uploadLocation(convertToRequestBodyjson(locationReq))); } public Observable> getDeveloperOptionsObservable(BehaviorSubject provider) { - return schedule(mRetrofit.create(SnApi.class).getDeveloperOptions(), provider); + return schedule(getApiService(SnApi.class).getDeveloperOptions(), provider); } public Observable> getDeveloperOptionsObservable() { - return schedule(mRetrofit.create(SnApi.class).getDeveloperOptions()); + return schedule(getApiService(SnApi.class).getDeveloperOptions()); } public Observable getUploadInstallApksObservable(RequestBody body) { - return schedule(mRetrofit.create(SnApi.class).uploadInstallApks(body)); + return schedule(getApiService(SnApi.class).uploadInstallApks(body)); } + public Observable>> getContactListObservable(BehaviorSubject provider) { + return schedule(getApiService(ContactApi.class).getContactList(), provider); + } + + public Observable> getContactInsertObservable(ContactInfo contactInfo, BehaviorSubject provider) { + return schedule(getApiService(ContactApi.class).insertContact(convertToRequestBodyjson(contactInfo)), provider); + } + + public Observable> getContactInsertObservable(ContactInfo contactInfo) { + return schedule(getApiService(ContactApi.class).insertContact(convertToRequestBodyjson(contactInfo))); + } + + public Observable> getContactFormObservable(long id, BehaviorSubject provider) { + return schedule(getApiService(ContactApi.class).getContactForm(id), provider); + } + + public Observable> getContactUpdateObservable(long id, ContactInfo contactInfo, BehaviorSubject provider) { + return schedule(getApiService(ContactApi.class).updateContact(id, convertToRequestBodyjson(contactInfo)), provider); + } + + public Observable getContactDeleteObservable(long id, BehaviorSubject provider) { + return schedule(getApiService(ContactApi.class).deleteContact(id), provider); + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/ttstd/dialer/network/UrlConstants.java b/app/src/main/java/com/ttstd/dialer/network/UrlConstants.java index a00a4b7..38992f3 100644 --- a/app/src/main/java/com/ttstd/dialer/network/UrlConstants.java +++ b/app/src/main/java/com/ttstd/dialer/network/UrlConstants.java @@ -16,4 +16,11 @@ public class UrlConstants { /*上传设备已安装应用列表*/ public static final String UPLOAD_INSTALL_APKS = "upload_install_apks"; + + public static final String CONTACT_LIST = "contact/list"; + public static final String CONTACT_INSERT = "contact/insert"; + public static final String CONTACT_FORM = "contact/form"; + public static final String CONTACT_UPDATE = "contact/update"; + public static final String CONTACT_DELETE = "contact/delete"; + } diff --git a/app/src/main/java/com/ttstd/dialer/network/api/ContactApi.java b/app/src/main/java/com/ttstd/dialer/network/api/ContactApi.java new file mode 100644 index 0000000..2a20d3d --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/network/api/ContactApi.java @@ -0,0 +1,45 @@ +package com.ttstd.dialer.network.api; + +import com.ttstd.dialer.bean.BaseResponse; +import com.ttstd.dialer.db.contact.ContactInfo; +import com.ttstd.dialer.network.UrlConstants; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import okhttp3.RequestBody; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Query; + +public interface ContactApi { + @GET(UrlConstants.CONTACT_LIST) + Observable>> getContactList( + ); + + @POST(UrlConstants.CONTACT_INSERT) + Observable> insertContact( + @Body RequestBody body + ); + + @GET(UrlConstants.CONTACT_FORM) + Observable> getContactForm( + @Query("id") Long id + ); + + @PUT(UrlConstants.CONTACT_UPDATE) + Observable> updateContact( + @Query("id") long id, + @Body RequestBody body + ); + + @DELETE(UrlConstants.CONTACT_DELETE) + Observable deleteContact( + @Query("id") Long id + ); + + +} diff --git a/app/src/main/java/com/ttstd/dialer/network/interceptor/AuthInterceptor.java b/app/src/main/java/com/ttstd/dialer/network/interceptor/AuthInterceptor.java index 0294dca..70aeced 100644 --- a/app/src/main/java/com/ttstd/dialer/network/interceptor/AuthInterceptor.java +++ b/app/src/main/java/com/ttstd/dialer/network/interceptor/AuthInterceptor.java @@ -1,5 +1,7 @@ package com.ttstd.dialer.network.interceptor; +import android.util.Log; + import androidx.annotation.NonNull; import com.ttstd.dialer.mdm.DeviceManagerService; @@ -51,6 +53,10 @@ public class AuthInterceptor implements Interceptor { headersMap.put("X-Timestamp", String.valueOf(timestamp)); String sign = SecurityUtils.generateSign(headersMap); headersMap.put("X-Sign", sign); + Log.e("AuthInterceptor", "intercept: X-Device-SN = " + sn); + Log.e("AuthInterceptor", "intercept: X-Nonce = " + nonce); + Log.e("AuthInterceptor", "intercept: X-Timestamp = " + timestamp); + Log.e("AuthInterceptor", "intercept: X-Sign = " + sign); // 2. 构建请求头(所有参数放header,防止URL被抓包泄露) Headers headers = Headers.of(headersMap); diff --git a/app/src/main/java/com/ttstd/dialer/service/main/MainService.java b/app/src/main/java/com/ttstd/dialer/service/main/MainService.java index c70828d..48a126b 100644 --- a/app/src/main/java/com/ttstd/dialer/service/main/MainService.java +++ b/app/src/main/java/com/ttstd/dialer/service/main/MainService.java @@ -16,6 +16,7 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; +import com.blankj.utilcode.util.NetworkUtils; import com.hjq.toast.Toaster; import com.jeremyliao.liveeventbus.LiveEventBus; import com.shehuan.niv.NiceImageView; @@ -26,6 +27,7 @@ import com.ttstd.dialer.activity.main.MainActivity; import com.ttstd.dialer.base.BaseService; import com.ttstd.dialer.bean.req.SnLocationReq; import com.ttstd.dialer.config.CommonConfig; +import com.ttstd.dialer.manager.ContactSyncManager; import com.ttstd.dialer.utils.ApkUtils; import com.ttstd.dialer.utils.Logger; import com.ttstd.dialer.utils.SystemUtils; @@ -34,7 +36,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -public class MainService extends BaseService { +public class MainService extends BaseService implements NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = "MainService"; public static final String SHOW_FLOAT_WINDOW_ACTION = "show_float_window"; @@ -50,6 +52,17 @@ public class MainService extends BaseService { private WindowManager.LayoutParams mLayoutParams; private boolean mFloatWindowShowing = false; + @Override + public void onDisconnected() { + Logger.e(TAG, "onDisconnected: "); + } + + @Override + public void onConnected(NetworkUtils.NetworkType networkType) { + Logger.e(TAG, "onConnected: networkType = " + networkType); + ContactSyncManager.getInstance(this).syncPendingContacts(); + } + @Nullable @Override public IBinder onBind(Intent intent) { @@ -60,6 +73,9 @@ public class MainService extends BaseService { public void onCreate() { super.onCreate(); Logger.e(TAG, "onCreate: "); + + NetworkUtils.registerNetworkStatusChangedListener(this); + // 初始化ViewModel(绑定上下文+View回调) mViewModel = new MainServiceModel(); // 绑定Service生命周期(关键:让请求跟随生命周期) @@ -250,6 +266,7 @@ public class MainService extends BaseService { @Override public void onDestroy() { super.onDestroy(); + NetworkUtils.unregisterNetworkStatusChangedListener(this); // 务必在服务销毁时移除 View,防止内存泄漏或系统崩溃 if (floatingView != null) { mWindowManager.removeView(floatingView); @@ -275,4 +292,6 @@ public class MainService extends BaseService { public void onRebind(Intent intent) { super.onRebind(intent); } + + } diff --git a/app/src/main/java/com/ttstd/dialer/utils/AvatarCacheUtil.java b/app/src/main/java/com/ttstd/dialer/utils/AvatarCacheUtil.java new file mode 100644 index 0000000..74e355f --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/utils/AvatarCacheUtil.java @@ -0,0 +1,212 @@ +package com.ttstd.dialer.utils; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.LruCache; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Random; + +public class AvatarCacheUtil { + // 柔和背景色 + private static final int[] COLORS = { + 0xFFE57373, 0xFFBA68C8, 0xFF4FC3F7, 0xFF4DD0E1, + 0xFF81C784, 0xFFFFF176, 0xFFFFB74D, 0xFF9575CD + }; + private static final Random RANDOM = new Random(); + + // 内存缓存 LruCache + private static LruCache mMemoryCache; + // 缓存文件夹名 + private static final String CACHE_DIR_NAME = "avatar_cache"; + + static { + // 初始化内存缓存:最大占用1/8应用可用内存 + int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); + int cacheSize = maxMemory / 8; + mMemoryCache = new LruCache(cacheSize) { + @Override + protected int sizeOf(String key, Bitmap bitmap) { + return bitmap.getByteCount() / 1024; + } + }; + } + + // dp转px + private static int dp2px(Context context, float dp) { + float density = context.getResources().getDisplayMetrics().density; + return (int) (dp * density + 0.5f); + } + + /** + * 对外统一获取头像(优先内存→本地→重新生成) + */ + public static Bitmap getAvatar(Context context, String name, int size, boolean isCircle) { + if (name == null) name = ""; + String cacheKey = getCacheKey(name, size, isCircle); + + // 1.查内存缓存 + Bitmap memoryBitmap = getMemoryCache(cacheKey); + if (memoryBitmap != null) { + return memoryBitmap; + } + + // 2.查本地磁盘缓存 + Bitmap diskBitmap = getDiskCache(context, cacheKey); + if (diskBitmap != null) { + // 存入内存 + putMemoryCache(cacheKey, diskBitmap); + return diskBitmap; + } + + // 3.都没有,重新生成 + Bitmap newBitmap = generateAvatar(name, size, isCircle); + // 存入双层缓存 + putMemoryCache(cacheKey, newBitmap); + putDiskCache(context, cacheKey, newBitmap); + return newBitmap; + } + + public static Bitmap getAvatar(Context context, String name) { + if (name == null) name = ""; + String cacheKey = getCacheKey(name, dp2px(context, 50), true); + + // 1.查内存缓存 + Bitmap memoryBitmap = getMemoryCache(cacheKey); + if (memoryBitmap != null) { + return memoryBitmap; + } + + // 2.查本地磁盘缓存 + Bitmap diskBitmap = getDiskCache(context, cacheKey); + if (diskBitmap != null) { + // 存入内存 + putMemoryCache(cacheKey, diskBitmap); + return diskBitmap; + } + + // 3.都没有,重新生成 + Bitmap newBitmap = generateAvatar(name, dp2px(context, 50), true); + // 存入双层缓存 + putMemoryCache(cacheKey, newBitmap); + putDiskCache(context, cacheKey, newBitmap); + return newBitmap; + } + + // ========== 内存缓存操作 ========== + private static void putMemoryCache(String key, Bitmap bitmap) { + if (getMemoryCache(key) == null) { + mMemoryCache.put(key, bitmap); + } + } + + private static Bitmap getMemoryCache(String key) { + return mMemoryCache.get(key); + } + + // ========== 本地磁盘缓存操作 ========== + private static File getCacheDir(Context context) { + File cacheDir = new File(context.getExternalCacheDir(), CACHE_DIR_NAME); + if (!cacheDir.exists()) { + cacheDir.mkdirs(); + } + return cacheDir; + } + + private static void putDiskCache(Context context, String key, Bitmap bitmap) { + File file = new File(getCacheDir(context), key + ".png"); + FileOutputStream fos = null; + try { + fos = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (fos != null) fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static Bitmap getDiskCache(Context context, String key) { + File file = new File(getCacheDir(context), key + ".png"); + if (!file.exists()) return null; + return BitmapFactory.decodeFile(file.getAbsolutePath()); + } + + // ========== 生成唯一缓存Key ========== + private static String getCacheKey(String name, int size, boolean isCircle) { + // 名字+尺寸+形状 组合唯一key,避免不同尺寸头像冲突 + return name.trim() + "_" + size + "_" + (isCircle ? "circle" : "square"); + } + + // ========== 核心绘制头像方法 ========== + private static Bitmap generateAvatar(String name, int size, boolean isCircle) { + Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + bgPaint.setColor(getRandomColor()); + if (isCircle) { + float r = size / 2f; + canvas.drawCircle(r, r, r, bgPaint); + } else { + canvas.drawRect(0, 0, size, size, bgPaint); + } + + String text = getFirstChar(name); + Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + textPaint.setColor(Color.WHITE); + textPaint.setTextSize(size * 0.4f); + textPaint.setTextAlign(Paint.Align.CENTER); + + Rect rect = new Rect(); + textPaint.getTextBounds(text, 0, text.length(), rect); + float centerY = size / 2f + (rect.bottom - rect.top) / 2f - rect.bottom; + canvas.drawText(text, size / 2f, centerY, textPaint); + + return bitmap; + } + + private static String getFirstChar(String name) { + if (name == null || name.trim().isEmpty()) return "A"; + return String.valueOf(name.trim().charAt(0)).toUpperCase(); + } + + private static int getRandomColor() { + return COLORS[RANDOM.nextInt(COLORS.length)]; + } + + // ========== 清除缓存方法 ========== + + /** + * 清除内存缓存 + */ + public static void clearMemoryCache() { + mMemoryCache.evictAll(); + } + + /** + * 清除本地所有头像缓存 + */ + public static void clearDiskCache(Context context) { + File dir = getCacheDir(context); + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (files != null) { + for (File f : files) { + f.delete(); + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ttstd/dialer/utils/GlideUtils.java b/app/src/main/java/com/ttstd/dialer/utils/GlideUtils.java new file mode 100644 index 0000000..1e0a17b --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/utils/GlideUtils.java @@ -0,0 +1,368 @@ +package com.ttstd.dialer.utils; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.widget.ImageView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; + +import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.request.RequestListener; +import com.ttstd.dialer.glide.GlideApp; + +/** + * Glide 图片加载工具类 + * 包含 Activity/Fragment 生命周期检查和常用加载方法 + */ +public class GlideUtils { + + private static final String TAG = "GlideUtils"; + + /** + * 检查 Activity 是否有效(未销毁且未 finishing) + * + * @param activity Activity + * @return true: 有效, false: 已销毁或正在销毁 + */ + public static boolean isActivityValid(@Nullable Activity activity) { + if (activity == null) { + Logger.w(TAG, "Activity is null"); + return false; + } + if (activity.isFinishing()) { + Logger.w(TAG, "Activity is finishing: " + activity.getClass().getSimpleName()); + return false; + } + if (activity.isDestroyed()) { + Logger.w(TAG, "Activity is destroyed: " + activity.getClass().getSimpleName()); + return false; + } + return true; + } + + /** + * 检查 FragmentActivity 是否有效 + * + * @param activity FragmentActivity + * @return true: 有效, false: 已销毁或正在销毁 + */ + public static boolean isFragmentActivityValid(@Nullable FragmentActivity activity) { + if (activity == null) { + Logger.w(TAG, "FragmentActivity is null"); + return false; + } + return isActivityValid(activity); + } + + /** + * 检查 Fragment 是否有效 + * + * @param fragment Fragment + * @return true: 有效, false: 未附加或 Activity 已销毁 + */ + public static boolean isFragmentValid(@Nullable Fragment fragment) { + if (fragment == null) { + Logger.w(TAG, "Fragment is null"); + return false; + } + if (!fragment.isAdded()) { + Logger.w(TAG, "Fragment is not added"); + return false; + } + Activity activity = fragment.getActivity(); + return isActivityValid(activity); + } + + /** + * 安全地获取 Glide RequestManager + * 自动检查 Context 类型和生命周期状态 + * + * @param context Context + * @return RequestManager,如果 Context 无效则返回 null + */ + @Nullable + public static RequestBuilder getSafeRequestManager(@Nullable Context context) { + if (context == null) { + Logger.w(TAG, "Context is null"); + return null; + } + + if (context instanceof FragmentActivity) { + FragmentActivity activity = (FragmentActivity) context; + if (!isFragmentActivityValid(activity)) { + return null; + } + return GlideApp.with(activity).asDrawable(); + } else if (context instanceof Activity) { + Activity activity = (Activity) context; + if (!isActivityValid(activity)) { + return null; + } + return GlideApp.with(activity).asDrawable(); + } else { + // Application Context,无需检查生命周期 + return GlideApp.with(context).asDrawable(); + } + } + + /** + * 安全地加载图片到 ImageView + * 自动检查 Activity 生命周期 + * + * @param context Context + * @param url 图片URL + * @param imageView 目标ImageView + */ + public static void loadImageSafe(@Nullable Context context, @Nullable String url, @NonNull ImageView imageView) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .into(imageView); + } + + /** + * 安全地加载图片到 ImageView(带占位图和错误图) + * + * @param context Context + * @param url 图片URL + * @param imageView 目标ImageView + * @param errorId 错误图资源ID + */ + public static void loadImageSafe(@Nullable Context context, @Nullable String url, + @NonNull ImageView imageView, + @DrawableRes int errorId) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .error(errorId) + .into(imageView); + } + + public static void loadImageSafe(@Nullable Context context, @Nullable String url, + @NonNull ImageView imageView, + Drawable drawable) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .error(drawable) + .into(imageView); + } + + public static void loadImageSafe(@Nullable Context context, @Nullable String url, + @NonNull ImageView imageView, + Bitmap bitmap) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .error(bitmap) + .into(imageView); + } + + + /** + * 安全地加载图片到 ImageView(带占位图和错误图) + * + * @param context Context + * @param url 图片URL + * @param imageView 目标ImageView + * @param placeholderId 占位图资源ID + * @param errorId 错误图资源ID + */ + public static void loadImageSafe(@Nullable Context context, @Nullable String url, + @NonNull ImageView imageView, + @DrawableRes int placeholderId, + @DrawableRes int errorId) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .placeholder(placeholderId) + .error(errorId) + .into(imageView); + } + + /** + * 安全地加载 Bitmap 图片 + * + * @param context Context + * @param url 图片URL + * @param imageView 目标ImageView + */ + public static void loadBitmapSafe(@Nullable Context context, @Nullable String url, @NonNull ImageView imageView) { + if (context == null || url == null) { + Logger.w(TAG, "Context or URL is null"); + return; + } + + RequestBuilder requestManager = null; + + if (context instanceof FragmentActivity) { + FragmentActivity activity = (FragmentActivity) context; + if (!isFragmentActivityValid(activity)) { + return; + } + requestManager = GlideApp.with(activity).asBitmap(); + } else if (context instanceof Activity) { + Activity activity = (Activity) context; + if (!isActivityValid(activity)) { + return; + } + requestManager = GlideApp.with(activity).asBitmap(); + } + + if (requestManager != null) { + requestManager + .load(url) + .into(imageView); + } + } + + /** + * 安全地加载 Drawable 图片(带回调) + * + * @param context Context + * @param url 图片URL + * @param listener 加载回调监听器 + */ + public static void loadWithListener(@Nullable Context context, @Nullable String url, + @NonNull RequestListener listener) { + RequestBuilder requestManager = getSafeRequestManager(context); + if (requestManager == null) { + Logger.w(TAG, "Skip loading image due to invalid context"); + return; + } + + requestManager + .load(url) + .listener(listener) + .submit(); + } + + /** + * 从 Fragment 安全地加载图片 + * + * @param fragment Fragment + * @param url 图片URL + * @param imageView 目标ImageView + */ + public static void loadImageFromFragment(@Nullable Fragment fragment, @Nullable String url, + @NonNull ImageView imageView) { + if (!isFragmentValid(fragment)) { + Logger.w(TAG, "Skip loading from invalid fragment"); + return; + } + + GlideApp.with(fragment) + .load(url) + .into(imageView); + } + + /** + * 从 Fragment 安全地加载图片(带占位图和错误图) + * + * @param fragment Fragment + * @param url 图片URL + * @param imageView 目标ImageView + * @param placeholderId 占位图资源ID + * @param errorId 错误图资源ID + */ + public static void loadImageFromFragment(@Nullable Fragment fragment, @Nullable String url, + @NonNull ImageView imageView, + @DrawableRes int placeholderId, + @DrawableRes int errorId) { + if (!isFragmentValid(fragment)) { + Logger.w(TAG, "Skip loading from invalid fragment"); + return; + } + + GlideApp.with(fragment) + .load(url) + .placeholder(placeholderId) + .error(errorId) + .into(imageView); + } + + /** + * 清除 ImageView 的图片加载请求 + * 通常在 RecyclerView 复用时使用 + * + * @param imageView ImageView + */ + public static void clearImage(@NonNull ImageView imageView) { + GlideApp.with(imageView.getContext()).clear(imageView); + } + + /** + * 暂停所有图片加载请求 + * + * @param context Context + */ + public static void pauseRequests(@Nullable Context context) { + if (context != null) { + GlideApp.with(context).pauseRequests(); + } + } + + /** + * 恢复所有图片加载请求 + * + * @param context Context + */ + public static void resumeRequests(@Nullable Context context) { + if (context != null) { + GlideApp.with(context).resumeRequests(); + } + } + + /** + * 清除内存缓存 + * + * @param context Context + */ + public static void clearMemoryCache(@Nullable Context context) { + if (context != null) { + GlideApp.get(context).clearMemory(); + } + } + + /** + * 清除磁盘缓存(需在后台线程执行) + * + * @param context Context + */ + public static void clearDiskCache(@Nullable Context context) { + if (context != null) { + GlideApp.get(context).clearDiskCache(); + } + } +} diff --git a/app/src/main/java/com/ttstd/dialer/utils/PhoneUtils.java b/app/src/main/java/com/ttstd/dialer/utils/PhoneUtils.java new file mode 100644 index 0000000..5a73254 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/utils/PhoneUtils.java @@ -0,0 +1,20 @@ +package com.ttstd.dialer.utils; + +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; + +public class PhoneUtils { + public static boolean isValidPhone(String phone, String regionCode) { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + try { + Phonenumber.PhoneNumber number = util.parse(phone, regionCode); + return util.isValidNumber(number); // ✅ 座机 & 手机都返回 true + } catch (Exception e) { + return false; + } + } + + public static boolean isValidPhone(String phone) { + return isValidPhone(phone, "CN"); + } +} diff --git a/app/src/main/java/com/ttstd/dialer/view/BindingAdapters.java b/app/src/main/java/com/ttstd/dialer/view/BindingAdapters.java new file mode 100644 index 0000000..a30ee06 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/view/BindingAdapters.java @@ -0,0 +1,20 @@ +package com.ttstd.dialer.view; + +import androidx.databinding.BindingAdapter; + +import com.suke.widget.SwitchButton; + +public class BindingAdapters { + +// @BindingAdapter({"imageUrl", "urlError"}) +// public static void loadImage(ImageView imageView, String url, @DrawableRes int errorId) { +// GlideUtils.loadImageSafe(imageView.getContext(), url, imageView, errorId); +// } + + + @BindingAdapter(value = {"sb_checked"}, requireAll = false) + public static void setSwitchButtonChecked(SwitchButton switchButton, boolean checked) { + switchButton.setChecked(checked); + } +} + diff --git a/app/src/main/java/com/ttstd/dialer/view/ClearEditText.java b/app/src/main/java/com/ttstd/dialer/view/ClearEditText.java new file mode 100644 index 0000000..0f2ad1b --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/view/ClearEditText.java @@ -0,0 +1,98 @@ +package com.ttstd.dialer.view; + +import android.content.Context; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.AppCompatEditText; + +import com.ttstd.dialer.R; + +public class ClearEditText extends AppCompatEditText { + + private Drawable clearDrawable; + + public ClearEditText(Context context) { + super(context); + init(); + } + + public ClearEditText(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + public ClearEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + // 换成你自己的清除图标 + clearDrawable = AppCompatResources.getDrawable(getContext(), R.drawable.ic_clear); + + if (clearDrawable != null) { + clearDrawable.setBounds(0, 0, + clearDrawable.getIntrinsicWidth(), + clearDrawable.getIntrinsicHeight()); + } + + updateClearButton(); + + addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + updateClearButton(); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + } + + private void updateClearButton() { + Drawable endDrawable = length() > 0 ? clearDrawable : null; + setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, endDrawable, null); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (clearDrawable != null + && event.getAction() == MotionEvent.ACTION_UP + && getCompoundDrawablesRelative()[2] != null) { + + int touchX = (int) event.getX(); + int width = getWidth(); + int paddingEnd = getPaddingEnd(); + int drawableWidth = clearDrawable.getBounds().width(); + + if (touchX >= width - paddingEnd - drawableWidth) { + setText(""); + event.setAction(MotionEvent.ACTION_CANCEL); + return true; + } + } + return super.onTouchEvent(event); + } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + if (focused) { + updateClearButton(); + } else { + setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, null, null); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ttstd/dialer/view/TransparentCardView.java b/app/src/main/java/com/ttstd/dialer/view/TransparentCardView.java new file mode 100644 index 0000000..7c67cf9 --- /dev/null +++ b/app/src/main/java/com/ttstd/dialer/view/TransparentCardView.java @@ -0,0 +1,104 @@ +package com.ttstd.dialer.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; + +import com.ttstd.dialer.R; + +public class TransparentCardView extends CardView { + + private FrameLayout mContent; + private GradientDrawable mBackgroundDrawable; + + private float mCornerRadius = 0f; + private float mShadowElevation = 0f; + private int mBackgroundColor = Color.WHITE; + + public TransparentCardView(Context context) { + this(context, null); + } + + public TransparentCardView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public TransparentCardView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + initAttrs(context, attrs); + initView(context); + } + + private void initAttrs(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TransparentCardView); + try { + mCornerRadius = a.getDimension( + R.styleable.TransparentCardView_tcv_cornerRadius, dpToPx(12)); + mShadowElevation = a.getDimension( + R.styleable.TransparentCardView_tcv_elevation, dpToPx(8)); + mBackgroundColor = a.getColor( + R.styleable.TransparentCardView_tcv_backgroundColor, Color.WHITE); + } finally { + a.recycle(); + } + } + + private void initView(Context context) { + // 1️⃣ CardView 本身必须是透明的 + setCardBackgroundColor(Color.TRANSPARENT); + setRadius(mCornerRadius); + setCardElevation(mShadowElevation); + setMaxCardElevation(mShadowElevation + dpToPx(4)); + setUseCompatPadding(true); + setPreventCornerOverlap(false); + + // 2️⃣ 创建内部容器(真正承载半透明背景) + mContent = new FrameLayout(context); + LayoutParams params = new LayoutParams( + LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT + ); + mContent.setLayoutParams(params); + + // 3️⃣ 创建圆角半透明背景 + mBackgroundDrawable = new GradientDrawable(); + mBackgroundDrawable.setShape(GradientDrawable.RECTANGLE); + mBackgroundDrawable.setCornerRadius(mCornerRadius); + mBackgroundDrawable.setColor(mBackgroundColor); + + mContent.setBackground(mBackgroundDrawable); + + // 4️⃣ 添加到 CardView + addView(mContent); + } + + /* ================== API ================== */ + + public void setTransparentBackgroundColor(int color) { + mBackgroundColor = color; + mBackgroundDrawable.setColor(color); + } + + public void setCornerRadiusDp(float dp) { + float radius = dpToPx(dp); + setRadius(radius); + mBackgroundDrawable.setCornerRadius(radius); + } + + public FrameLayout getContentContainer() { + return mContent; + } + + /* ================== Util ================== */ + + private float dpToPx(float dp) { + return dp * getResources().getDisplayMetrics().density; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/ttstd/dialer/wallpager/WallpaperScrollHelper.java b/app/src/main/java/com/ttstd/dialer/wallpager/WallpaperScrollHelper.java index bf9a1a8..2802cfe 100644 --- a/app/src/main/java/com/ttstd/dialer/wallpager/WallpaperScrollHelper.java +++ b/app/src/main/java/com/ttstd/dialer/wallpager/WallpaperScrollHelper.java @@ -25,7 +25,7 @@ public class WallpaperScrollHelper { public void onResume() { setupWallpaperOffsetSteps(); - syncWallpaperOffset(0f); +// syncWallpaperOffset(0f); } public void onDestroy() { diff --git a/app/src/main/res/drawable-anydpi/qweather_100.xml b/app/src/main/res/drawable-anydpi/qweather_100.xml new file mode 100644 index 0000000..8846464 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_100.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1001.xml b/app/src/main/res/drawable-anydpi/qweather_1001.xml new file mode 100644 index 0000000..b53216c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1001.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1002.xml b/app/src/main/res/drawable-anydpi/qweather_1002.xml new file mode 100644 index 0000000..4e38bde --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1002.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1003.xml b/app/src/main/res/drawable-anydpi/qweather_1003.xml new file mode 100644 index 0000000..3aef599 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1003.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1004.xml b/app/src/main/res/drawable-anydpi/qweather_1004.xml new file mode 100644 index 0000000..43ee3b9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1004.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1005.xml b/app/src/main/res/drawable-anydpi/qweather_1005.xml new file mode 100644 index 0000000..18af45e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1005.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1006.xml b/app/src/main/res/drawable-anydpi/qweather_1006.xml new file mode 100644 index 0000000..769524c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1006.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1007.xml b/app/src/main/res/drawable-anydpi/qweather_1007.xml new file mode 100644 index 0000000..05b2b58 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1007.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1008.xml b/app/src/main/res/drawable-anydpi/qweather_1008.xml new file mode 100644 index 0000000..f1859d6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1008.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1009.xml b/app/src/main/res/drawable-anydpi/qweather_1009.xml new file mode 100644 index 0000000..193a38f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1009.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_100_fill.xml b/app/src/main/res/drawable-anydpi/qweather_100_fill.xml new file mode 100644 index 0000000..ccea402 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_100_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_101.xml b/app/src/main/res/drawable-anydpi/qweather_101.xml new file mode 100644 index 0000000..5d3b757 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_101.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1010.xml b/app/src/main/res/drawable-anydpi/qweather_1010.xml new file mode 100644 index 0000000..cfd36c2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1010.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1011.xml b/app/src/main/res/drawable-anydpi/qweather_1011.xml new file mode 100644 index 0000000..adf4ee9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1011.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1012.xml b/app/src/main/res/drawable-anydpi/qweather_1012.xml new file mode 100644 index 0000000..314afae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1012.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1013.xml b/app/src/main/res/drawable-anydpi/qweather_1013.xml new file mode 100644 index 0000000..cfcc9cb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1013.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1014.xml b/app/src/main/res/drawable-anydpi/qweather_1014.xml new file mode 100644 index 0000000..c521d5d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1014.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1015.xml b/app/src/main/res/drawable-anydpi/qweather_1015.xml new file mode 100644 index 0000000..7396874 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1015.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1016.xml b/app/src/main/res/drawable-anydpi/qweather_1016.xml new file mode 100644 index 0000000..a4ca614 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1016.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1017.xml b/app/src/main/res/drawable-anydpi/qweather_1017.xml new file mode 100644 index 0000000..db21115 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1017.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1018.xml b/app/src/main/res/drawable-anydpi/qweather_1018.xml new file mode 100644 index 0000000..873978d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1018.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1019.xml b/app/src/main/res/drawable-anydpi/qweather_1019.xml new file mode 100644 index 0000000..fd1906b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1019.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_101_fill.xml b/app/src/main/res/drawable-anydpi/qweather_101_fill.xml new file mode 100644 index 0000000..9c84b25 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_101_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_102.xml b/app/src/main/res/drawable-anydpi/qweather_102.xml new file mode 100644 index 0000000..72a425b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_102.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1020.xml b/app/src/main/res/drawable-anydpi/qweather_1020.xml new file mode 100644 index 0000000..7c3a16a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1020.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1021.xml b/app/src/main/res/drawable-anydpi/qweather_1021.xml new file mode 100644 index 0000000..707e248 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1021.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1022.xml b/app/src/main/res/drawable-anydpi/qweather_1022.xml new file mode 100644 index 0000000..294dae5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1022.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1023.xml b/app/src/main/res/drawable-anydpi/qweather_1023.xml new file mode 100644 index 0000000..525f77e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1023.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1024.xml b/app/src/main/res/drawable-anydpi/qweather_1024.xml new file mode 100644 index 0000000..e474721 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1024.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1025.xml b/app/src/main/res/drawable-anydpi/qweather_1025.xml new file mode 100644 index 0000000..463cf7d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1025.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1026.xml b/app/src/main/res/drawable-anydpi/qweather_1026.xml new file mode 100644 index 0000000..abd2c0c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1026.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1027.xml b/app/src/main/res/drawable-anydpi/qweather_1027.xml new file mode 100644 index 0000000..d4e93ad --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1027.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1028.xml b/app/src/main/res/drawable-anydpi/qweather_1028.xml new file mode 100644 index 0000000..23fb569 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1028.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1029.xml b/app/src/main/res/drawable-anydpi/qweather_1029.xml new file mode 100644 index 0000000..d0f8c34 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1029.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_102_fill.xml b/app/src/main/res/drawable-anydpi/qweather_102_fill.xml new file mode 100644 index 0000000..5e17f44 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_102_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_103.xml b/app/src/main/res/drawable-anydpi/qweather_103.xml new file mode 100644 index 0000000..743c26c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_103.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1030.xml b/app/src/main/res/drawable-anydpi/qweather_1030.xml new file mode 100644 index 0000000..6debeec --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1030.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1031.xml b/app/src/main/res/drawable-anydpi/qweather_1031.xml new file mode 100644 index 0000000..c2dbed3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1031.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1032.xml b/app/src/main/res/drawable-anydpi/qweather_1032.xml new file mode 100644 index 0000000..4f76665 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1032.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1033.xml b/app/src/main/res/drawable-anydpi/qweather_1033.xml new file mode 100644 index 0000000..15f08b9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1033.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1034.xml b/app/src/main/res/drawable-anydpi/qweather_1034.xml new file mode 100644 index 0000000..2a93d1c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1034.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1035.xml b/app/src/main/res/drawable-anydpi/qweather_1035.xml new file mode 100644 index 0000000..ec2ea5a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1035.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1036.xml b/app/src/main/res/drawable-anydpi/qweather_1036.xml new file mode 100644 index 0000000..2f15bdf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1036.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1037.xml b/app/src/main/res/drawable-anydpi/qweather_1037.xml new file mode 100644 index 0000000..082fcab --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1037.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1038.xml b/app/src/main/res/drawable-anydpi/qweather_1038.xml new file mode 100644 index 0000000..6f446fa --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1038.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1039.xml b/app/src/main/res/drawable-anydpi/qweather_1039.xml new file mode 100644 index 0000000..d868617 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1039.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_103_fill.xml b/app/src/main/res/drawable-anydpi/qweather_103_fill.xml new file mode 100644 index 0000000..f88794f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_103_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_104.xml b/app/src/main/res/drawable-anydpi/qweather_104.xml new file mode 100644 index 0000000..c7be19e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_104.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1040.xml b/app/src/main/res/drawable-anydpi/qweather_1040.xml new file mode 100644 index 0000000..0ed1e60 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1040.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1041.xml b/app/src/main/res/drawable-anydpi/qweather_1041.xml new file mode 100644 index 0000000..21377c4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1041.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1042.xml b/app/src/main/res/drawable-anydpi/qweather_1042.xml new file mode 100644 index 0000000..9fe37b7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1042.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1043.xml b/app/src/main/res/drawable-anydpi/qweather_1043.xml new file mode 100644 index 0000000..4a44652 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1043.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1044.xml b/app/src/main/res/drawable-anydpi/qweather_1044.xml new file mode 100644 index 0000000..fd35ba4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1044.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1045.xml b/app/src/main/res/drawable-anydpi/qweather_1045.xml new file mode 100644 index 0000000..5313851 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1045.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1046.xml b/app/src/main/res/drawable-anydpi/qweather_1046.xml new file mode 100644 index 0000000..b4b7b9b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1046.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1047.xml b/app/src/main/res/drawable-anydpi/qweather_1047.xml new file mode 100644 index 0000000..df21c9e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1047.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1048.xml b/app/src/main/res/drawable-anydpi/qweather_1048.xml new file mode 100644 index 0000000..184462d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1048.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1049.xml b/app/src/main/res/drawable-anydpi/qweather_1049.xml new file mode 100644 index 0000000..9dcf95c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1049.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_104_fill.xml b/app/src/main/res/drawable-anydpi/qweather_104_fill.xml new file mode 100644 index 0000000..4487e3c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_104_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1050.xml b/app/src/main/res/drawable-anydpi/qweather_1050.xml new file mode 100644 index 0000000..9f446cc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1050.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1051.xml b/app/src/main/res/drawable-anydpi/qweather_1051.xml new file mode 100644 index 0000000..0f99c8f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1051.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1052.xml b/app/src/main/res/drawable-anydpi/qweather_1052.xml new file mode 100644 index 0000000..2c1b951 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1052.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1053.xml b/app/src/main/res/drawable-anydpi/qweather_1053.xml new file mode 100644 index 0000000..8d96100 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1053.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1054.xml b/app/src/main/res/drawable-anydpi/qweather_1054.xml new file mode 100644 index 0000000..462f5a4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1054.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1055.xml b/app/src/main/res/drawable-anydpi/qweather_1055.xml new file mode 100644 index 0000000..0816339 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1055.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1056.xml b/app/src/main/res/drawable-anydpi/qweather_1056.xml new file mode 100644 index 0000000..9cdabcc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1056.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1057.xml b/app/src/main/res/drawable-anydpi/qweather_1057.xml new file mode 100644 index 0000000..ce45e15 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1057.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1058.xml b/app/src/main/res/drawable-anydpi/qweather_1058.xml new file mode 100644 index 0000000..2f3fa24 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1058.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1059.xml b/app/src/main/res/drawable-anydpi/qweather_1059.xml new file mode 100644 index 0000000..b5bb176 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1059.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1060.xml b/app/src/main/res/drawable-anydpi/qweather_1060.xml new file mode 100644 index 0000000..8f0ffff --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1060.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1061.xml b/app/src/main/res/drawable-anydpi/qweather_1061.xml new file mode 100644 index 0000000..798e9e7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1061.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1062.xml b/app/src/main/res/drawable-anydpi/qweather_1062.xml new file mode 100644 index 0000000..3e54aa0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1062.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1063.xml b/app/src/main/res/drawable-anydpi/qweather_1063.xml new file mode 100644 index 0000000..ca9e5d7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1063.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1064.xml b/app/src/main/res/drawable-anydpi/qweather_1064.xml new file mode 100644 index 0000000..0381b59 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1064.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1065.xml b/app/src/main/res/drawable-anydpi/qweather_1065.xml new file mode 100644 index 0000000..147a2fb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1065.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1066.xml b/app/src/main/res/drawable-anydpi/qweather_1066.xml new file mode 100644 index 0000000..ea82c69 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1066.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1067.xml b/app/src/main/res/drawable-anydpi/qweather_1067.xml new file mode 100644 index 0000000..52d72c5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1067.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1068.xml b/app/src/main/res/drawable-anydpi/qweather_1068.xml new file mode 100644 index 0000000..743df1c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1068.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1069.xml b/app/src/main/res/drawable-anydpi/qweather_1069.xml new file mode 100644 index 0000000..97d5164 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1069.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1071.xml b/app/src/main/res/drawable-anydpi/qweather_1071.xml new file mode 100644 index 0000000..16114be --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1071.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1072.xml b/app/src/main/res/drawable-anydpi/qweather_1072.xml new file mode 100644 index 0000000..7ae9904 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1072.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1073.xml b/app/src/main/res/drawable-anydpi/qweather_1073.xml new file mode 100644 index 0000000..d3dcb65 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1073.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1074.xml b/app/src/main/res/drawable-anydpi/qweather_1074.xml new file mode 100644 index 0000000..52d72c5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1074.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1075.xml b/app/src/main/res/drawable-anydpi/qweather_1075.xml new file mode 100644 index 0000000..6f48603 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1075.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1076.xml b/app/src/main/res/drawable-anydpi/qweather_1076.xml new file mode 100644 index 0000000..e250849 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1076.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1077.xml b/app/src/main/res/drawable-anydpi/qweather_1077.xml new file mode 100644 index 0000000..b9a784f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1077.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1078.xml b/app/src/main/res/drawable-anydpi/qweather_1078.xml new file mode 100644 index 0000000..3f64526 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1078.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1079.xml b/app/src/main/res/drawable-anydpi/qweather_1079.xml new file mode 100644 index 0000000..363841d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1079.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1080.xml b/app/src/main/res/drawable-anydpi/qweather_1080.xml new file mode 100644 index 0000000..e8b778c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1080.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1081.xml b/app/src/main/res/drawable-anydpi/qweather_1081.xml new file mode 100644 index 0000000..81b7a27 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1081.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1082.xml b/app/src/main/res/drawable-anydpi/qweather_1082.xml new file mode 100644 index 0000000..229af95 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1082.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1084.xml b/app/src/main/res/drawable-anydpi/qweather_1084.xml new file mode 100644 index 0000000..c3592e9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1084.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1085.xml b/app/src/main/res/drawable-anydpi/qweather_1085.xml new file mode 100644 index 0000000..154062a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1085.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1086.xml b/app/src/main/res/drawable-anydpi/qweather_1086.xml new file mode 100644 index 0000000..2040d48 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1086.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1087.xml b/app/src/main/res/drawable-anydpi/qweather_1087.xml new file mode 100644 index 0000000..5df5b1a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1087.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1088.xml b/app/src/main/res/drawable-anydpi/qweather_1088.xml new file mode 100644 index 0000000..a611ca7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1088.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1089.xml b/app/src/main/res/drawable-anydpi/qweather_1089.xml new file mode 100644 index 0000000..02a4966 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1089.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1201.xml b/app/src/main/res/drawable-anydpi/qweather_1201.xml new file mode 100644 index 0000000..b8d5cc6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1201.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1202.xml b/app/src/main/res/drawable-anydpi/qweather_1202.xml new file mode 100644 index 0000000..b29e487 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1202.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1203.xml b/app/src/main/res/drawable-anydpi/qweather_1203.xml new file mode 100644 index 0000000..ad6feee --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1203.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1204.xml b/app/src/main/res/drawable-anydpi/qweather_1204.xml new file mode 100644 index 0000000..025b2a4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1204.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1205.xml b/app/src/main/res/drawable-anydpi/qweather_1205.xml new file mode 100644 index 0000000..b30caeb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1205.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1206.xml b/app/src/main/res/drawable-anydpi/qweather_1206.xml new file mode 100644 index 0000000..2f15bdf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1206.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1207.xml b/app/src/main/res/drawable-anydpi/qweather_1207.xml new file mode 100644 index 0000000..2d32353 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1207.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1208.xml b/app/src/main/res/drawable-anydpi/qweather_1208.xml new file mode 100644 index 0000000..28496b7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1208.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1209.xml b/app/src/main/res/drawable-anydpi/qweather_1209.xml new file mode 100644 index 0000000..e250849 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1209.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1210.xml b/app/src/main/res/drawable-anydpi/qweather_1210.xml new file mode 100644 index 0000000..5bf31f4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1210.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1211.xml b/app/src/main/res/drawable-anydpi/qweather_1211.xml new file mode 100644 index 0000000..d3dcb65 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1211.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1212.xml b/app/src/main/res/drawable-anydpi/qweather_1212.xml new file mode 100644 index 0000000..fd5c9c7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1212.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1213.xml b/app/src/main/res/drawable-anydpi/qweather_1213.xml new file mode 100644 index 0000000..24ab8b7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1213.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1214.xml b/app/src/main/res/drawable-anydpi/qweather_1214.xml new file mode 100644 index 0000000..e1b0389 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1214.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1215.xml b/app/src/main/res/drawable-anydpi/qweather_1215.xml new file mode 100644 index 0000000..9fd893e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1215.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1216.xml b/app/src/main/res/drawable-anydpi/qweather_1216.xml new file mode 100644 index 0000000..37fba96 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1216.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1217.xml b/app/src/main/res/drawable-anydpi/qweather_1217.xml new file mode 100644 index 0000000..f674c93 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1217.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1218.xml b/app/src/main/res/drawable-anydpi/qweather_1218.xml new file mode 100644 index 0000000..c030671 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1218.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1219.xml b/app/src/main/res/drawable-anydpi/qweather_1219.xml new file mode 100644 index 0000000..8905c90 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1219.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1221.xml b/app/src/main/res/drawable-anydpi/qweather_1221.xml new file mode 100644 index 0000000..08e09f7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1221.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1241.xml b/app/src/main/res/drawable-anydpi/qweather_1241.xml new file mode 100644 index 0000000..8190995 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1241.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1242.xml b/app/src/main/res/drawable-anydpi/qweather_1242.xml new file mode 100644 index 0000000..fca4144 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1242.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1243.xml b/app/src/main/res/drawable-anydpi/qweather_1243.xml new file mode 100644 index 0000000..fa2788e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1243.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1244.xml b/app/src/main/res/drawable-anydpi/qweather_1244.xml new file mode 100644 index 0000000..c397f73 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1244.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1245.xml b/app/src/main/res/drawable-anydpi/qweather_1245.xml new file mode 100644 index 0000000..9ab62f2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1245.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1246.xml b/app/src/main/res/drawable-anydpi/qweather_1246.xml new file mode 100644 index 0000000..7dc5eef --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1246.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1247.xml b/app/src/main/res/drawable-anydpi/qweather_1247.xml new file mode 100644 index 0000000..d3a3ca8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1247.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1248.xml b/app/src/main/res/drawable-anydpi/qweather_1248.xml new file mode 100644 index 0000000..c2e9213 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1248.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1249.xml b/app/src/main/res/drawable-anydpi/qweather_1249.xml new file mode 100644 index 0000000..1516f23 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1249.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1250.xml b/app/src/main/res/drawable-anydpi/qweather_1250.xml new file mode 100644 index 0000000..e5f5bbb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1250.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1251.xml b/app/src/main/res/drawable-anydpi/qweather_1251.xml new file mode 100644 index 0000000..bb946b4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1251.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1271.xml b/app/src/main/res/drawable-anydpi/qweather_1271.xml new file mode 100644 index 0000000..d0bd5cf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1271.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1272.xml b/app/src/main/res/drawable-anydpi/qweather_1272.xml new file mode 100644 index 0000000..79aad16 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1272.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1273.xml b/app/src/main/res/drawable-anydpi/qweather_1273.xml new file mode 100644 index 0000000..689503f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1273.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1274.xml b/app/src/main/res/drawable-anydpi/qweather_1274.xml new file mode 100644 index 0000000..f482e23 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1274.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_150.xml b/app/src/main/res/drawable-anydpi/qweather_150.xml new file mode 100644 index 0000000..758bc63 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_150.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_150_fill.xml b/app/src/main/res/drawable-anydpi/qweather_150_fill.xml new file mode 100644 index 0000000..f8a2a9d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_150_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_151.xml b/app/src/main/res/drawable-anydpi/qweather_151.xml new file mode 100644 index 0000000..9b264ea --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_151.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_151_fill.xml b/app/src/main/res/drawable-anydpi/qweather_151_fill.xml new file mode 100644 index 0000000..f47f501 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_151_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_152.xml b/app/src/main/res/drawable-anydpi/qweather_152.xml new file mode 100644 index 0000000..4b22871 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_152.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_152_fill.xml b/app/src/main/res/drawable-anydpi/qweather_152_fill.xml new file mode 100644 index 0000000..e6229d3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_152_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_153.xml b/app/src/main/res/drawable-anydpi/qweather_153.xml new file mode 100644 index 0000000..2b3b3ba --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_153.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_153_fill.xml b/app/src/main/res/drawable-anydpi/qweather_153_fill.xml new file mode 100644 index 0000000..ce126e9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_153_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1601.xml b/app/src/main/res/drawable-anydpi/qweather_1601.xml new file mode 100644 index 0000000..6c85548 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1601.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1602.xml b/app/src/main/res/drawable-anydpi/qweather_1602.xml new file mode 100644 index 0000000..1fda15f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1602.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1603.xml b/app/src/main/res/drawable-anydpi/qweather_1603.xml new file mode 100644 index 0000000..6782b6d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1603.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1604.xml b/app/src/main/res/drawable-anydpi/qweather_1604.xml new file mode 100644 index 0000000..a68e7c0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1604.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1605.xml b/app/src/main/res/drawable-anydpi/qweather_1605.xml new file mode 100644 index 0000000..804e74d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1605.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1606.xml b/app/src/main/res/drawable-anydpi/qweather_1606.xml new file mode 100644 index 0000000..ad45b5c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1606.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1607.xml b/app/src/main/res/drawable-anydpi/qweather_1607.xml new file mode 100644 index 0000000..5b6f786 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1607.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1608.xml b/app/src/main/res/drawable-anydpi/qweather_1608.xml new file mode 100644 index 0000000..e64deba --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1608.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1609.xml b/app/src/main/res/drawable-anydpi/qweather_1609.xml new file mode 100644 index 0000000..72b5114 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1609.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1610.xml b/app/src/main/res/drawable-anydpi/qweather_1610.xml new file mode 100644 index 0000000..91cdd5d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1610.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1701.xml b/app/src/main/res/drawable-anydpi/qweather_1701.xml new file mode 100644 index 0000000..992ddf9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1701.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1702.xml b/app/src/main/res/drawable-anydpi/qweather_1702.xml new file mode 100644 index 0000000..dfc44ff --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1702.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1703.xml b/app/src/main/res/drawable-anydpi/qweather_1703.xml new file mode 100644 index 0000000..565da30 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1703.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1704.xml b/app/src/main/res/drawable-anydpi/qweather_1704.xml new file mode 100644 index 0000000..8762d14 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1704.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1705.xml b/app/src/main/res/drawable-anydpi/qweather_1705.xml new file mode 100644 index 0000000..f96af4c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1705.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1706.xml b/app/src/main/res/drawable-anydpi/qweather_1706.xml new file mode 100644 index 0000000..5a8cd07 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1706.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1707.xml b/app/src/main/res/drawable-anydpi/qweather_1707.xml new file mode 100644 index 0000000..ef198a8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1707.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1708.xml b/app/src/main/res/drawable-anydpi/qweather_1708.xml new file mode 100644 index 0000000..eb0e432 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1708.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1709.xml b/app/src/main/res/drawable-anydpi/qweather_1709.xml new file mode 100644 index 0000000..8c4e1e3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1709.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1710.xml b/app/src/main/res/drawable-anydpi/qweather_1710.xml new file mode 100644 index 0000000..fd71c20 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1710.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1801.xml b/app/src/main/res/drawable-anydpi/qweather_1801.xml new file mode 100644 index 0000000..485931c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1801.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1802.xml b/app/src/main/res/drawable-anydpi/qweather_1802.xml new file mode 100644 index 0000000..67af473 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1802.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1803.xml b/app/src/main/res/drawable-anydpi/qweather_1803.xml new file mode 100644 index 0000000..a68e7c0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1803.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1804.xml b/app/src/main/res/drawable-anydpi/qweather_1804.xml new file mode 100644 index 0000000..a43e33c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1804.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_1805.xml b/app/src/main/res/drawable-anydpi/qweather_1805.xml new file mode 100644 index 0000000..993278c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_1805.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2001.xml b/app/src/main/res/drawable-anydpi/qweather_2001.xml new file mode 100644 index 0000000..308daaf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2001.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2002.xml b/app/src/main/res/drawable-anydpi/qweather_2002.xml new file mode 100644 index 0000000..04d938d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2002.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2003.xml b/app/src/main/res/drawable-anydpi/qweather_2003.xml new file mode 100644 index 0000000..55dd7bc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2003.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2004.xml b/app/src/main/res/drawable-anydpi/qweather_2004.xml new file mode 100644 index 0000000..82627d3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2004.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2005.xml b/app/src/main/res/drawable-anydpi/qweather_2005.xml new file mode 100644 index 0000000..ded2860 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2005.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2006.xml b/app/src/main/res/drawable-anydpi/qweather_2006.xml new file mode 100644 index 0000000..3a5ea34 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2006.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2007.xml b/app/src/main/res/drawable-anydpi/qweather_2007.xml new file mode 100644 index 0000000..887cdd7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2007.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2029.xml b/app/src/main/res/drawable-anydpi/qweather_2029.xml new file mode 100644 index 0000000..c4091ff --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2029.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2030.xml b/app/src/main/res/drawable-anydpi/qweather_2030.xml new file mode 100644 index 0000000..e04a6ff --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2030.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2031.xml b/app/src/main/res/drawable-anydpi/qweather_2031.xml new file mode 100644 index 0000000..4a61eac --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2031.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2032.xml b/app/src/main/res/drawable-anydpi/qweather_2032.xml new file mode 100644 index 0000000..e797890 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2032.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2033.xml b/app/src/main/res/drawable-anydpi/qweather_2033.xml new file mode 100644 index 0000000..9c37c64 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2033.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2050.xml b/app/src/main/res/drawable-anydpi/qweather_2050.xml new file mode 100644 index 0000000..886e442 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2050.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2051.xml b/app/src/main/res/drawable-anydpi/qweather_2051.xml new file mode 100644 index 0000000..032a029 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2051.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2052.xml b/app/src/main/res/drawable-anydpi/qweather_2052.xml new file mode 100644 index 0000000..4da205d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2052.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2053.xml b/app/src/main/res/drawable-anydpi/qweather_2053.xml new file mode 100644 index 0000000..3f4fd61 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2053.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2054.xml b/app/src/main/res/drawable-anydpi/qweather_2054.xml new file mode 100644 index 0000000..aad0d1e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2054.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2070.xml b/app/src/main/res/drawable-anydpi/qweather_2070.xml new file mode 100644 index 0000000..5f8ff0c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2070.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2071.xml b/app/src/main/res/drawable-anydpi/qweather_2071.xml new file mode 100644 index 0000000..e951c64 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2071.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2072.xml b/app/src/main/res/drawable-anydpi/qweather_2072.xml new file mode 100644 index 0000000..bea66fd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2072.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2073.xml b/app/src/main/res/drawable-anydpi/qweather_2073.xml new file mode 100644 index 0000000..13c12a0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2073.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2074.xml b/app/src/main/res/drawable-anydpi/qweather_2074.xml new file mode 100644 index 0000000..5947334 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2074.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2075.xml b/app/src/main/res/drawable-anydpi/qweather_2075.xml new file mode 100644 index 0000000..eefc9f9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2075.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2076.xml b/app/src/main/res/drawable-anydpi/qweather_2076.xml new file mode 100644 index 0000000..2d5897c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2076.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2077.xml b/app/src/main/res/drawable-anydpi/qweather_2077.xml new file mode 100644 index 0000000..b4b7b9b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2077.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2078.xml b/app/src/main/res/drawable-anydpi/qweather_2078.xml new file mode 100644 index 0000000..d728efe --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2078.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2079.xml b/app/src/main/res/drawable-anydpi/qweather_2079.xml new file mode 100644 index 0000000..8418b5f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2079.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2080.xml b/app/src/main/res/drawable-anydpi/qweather_2080.xml new file mode 100644 index 0000000..a884f6c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2080.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2081.xml b/app/src/main/res/drawable-anydpi/qweather_2081.xml new file mode 100644 index 0000000..d6e0be1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2081.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2082.xml b/app/src/main/res/drawable-anydpi/qweather_2082.xml new file mode 100644 index 0000000..cc419fe --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2082.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2083.xml b/app/src/main/res/drawable-anydpi/qweather_2083.xml new file mode 100644 index 0000000..2818357 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2083.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2084.xml b/app/src/main/res/drawable-anydpi/qweather_2084.xml new file mode 100644 index 0000000..78dedf3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2084.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2085.xml b/app/src/main/res/drawable-anydpi/qweather_2085.xml new file mode 100644 index 0000000..1bb43e5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2085.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2100.xml b/app/src/main/res/drawable-anydpi/qweather_2100.xml new file mode 100644 index 0000000..65e6cae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2100.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2101.xml b/app/src/main/res/drawable-anydpi/qweather_2101.xml new file mode 100644 index 0000000..3d23ada --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2101.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2102.xml b/app/src/main/res/drawable-anydpi/qweather_2102.xml new file mode 100644 index 0000000..e805b8d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2102.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2103.xml b/app/src/main/res/drawable-anydpi/qweather_2103.xml new file mode 100644 index 0000000..88c333b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2103.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2104.xml b/app/src/main/res/drawable-anydpi/qweather_2104.xml new file mode 100644 index 0000000..de29386 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2104.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2105.xml b/app/src/main/res/drawable-anydpi/qweather_2105.xml new file mode 100644 index 0000000..879a964 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2105.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2106.xml b/app/src/main/res/drawable-anydpi/qweather_2106.xml new file mode 100644 index 0000000..9eb2a57 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2106.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2107.xml b/app/src/main/res/drawable-anydpi/qweather_2107.xml new file mode 100644 index 0000000..c945039 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2107.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2108.xml b/app/src/main/res/drawable-anydpi/qweather_2108.xml new file mode 100644 index 0000000..53e5f02 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2108.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2109.xml b/app/src/main/res/drawable-anydpi/qweather_2109.xml new file mode 100644 index 0000000..eb9bd54 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2109.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2111.xml b/app/src/main/res/drawable-anydpi/qweather_2111.xml new file mode 100644 index 0000000..021bbf8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2111.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2120.xml b/app/src/main/res/drawable-anydpi/qweather_2120.xml new file mode 100644 index 0000000..a4bfd49 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2120.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2121.xml b/app/src/main/res/drawable-anydpi/qweather_2121.xml new file mode 100644 index 0000000..17e67a3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2121.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2122.xml b/app/src/main/res/drawable-anydpi/qweather_2122.xml new file mode 100644 index 0000000..d030a3a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2122.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2123.xml b/app/src/main/res/drawable-anydpi/qweather_2123.xml new file mode 100644 index 0000000..1f8158d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2123.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2124.xml b/app/src/main/res/drawable-anydpi/qweather_2124.xml new file mode 100644 index 0000000..3dd5742 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2124.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2125.xml b/app/src/main/res/drawable-anydpi/qweather_2125.xml new file mode 100644 index 0000000..c8b7da5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2125.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2126.xml b/app/src/main/res/drawable-anydpi/qweather_2126.xml new file mode 100644 index 0000000..b63e85f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2126.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2127.xml b/app/src/main/res/drawable-anydpi/qweather_2127.xml new file mode 100644 index 0000000..a4496da --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2127.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2128.xml b/app/src/main/res/drawable-anydpi/qweather_2128.xml new file mode 100644 index 0000000..2d39cc2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2128.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2129.xml b/app/src/main/res/drawable-anydpi/qweather_2129.xml new file mode 100644 index 0000000..edbbeae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2129.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2130.xml b/app/src/main/res/drawable-anydpi/qweather_2130.xml new file mode 100644 index 0000000..937c0a0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2130.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2131.xml b/app/src/main/res/drawable-anydpi/qweather_2131.xml new file mode 100644 index 0000000..9eb309a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2131.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2132.xml b/app/src/main/res/drawable-anydpi/qweather_2132.xml new file mode 100644 index 0000000..b373461 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2132.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2133.xml b/app/src/main/res/drawable-anydpi/qweather_2133.xml new file mode 100644 index 0000000..e9e61d6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2133.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2134.xml b/app/src/main/res/drawable-anydpi/qweather_2134.xml new file mode 100644 index 0000000..4405f78 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2134.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2135.xml b/app/src/main/res/drawable-anydpi/qweather_2135.xml new file mode 100644 index 0000000..87730f6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2135.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2150.xml b/app/src/main/res/drawable-anydpi/qweather_2150.xml new file mode 100644 index 0000000..797f3f1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2150.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2151.xml b/app/src/main/res/drawable-anydpi/qweather_2151.xml new file mode 100644 index 0000000..9671d1a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2151.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2152.xml b/app/src/main/res/drawable-anydpi/qweather_2152.xml new file mode 100644 index 0000000..730fce7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2152.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2153.xml b/app/src/main/res/drawable-anydpi/qweather_2153.xml new file mode 100644 index 0000000..f333a6e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2153.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2154.xml b/app/src/main/res/drawable-anydpi/qweather_2154.xml new file mode 100644 index 0000000..ea7b5de --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2154.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2155.xml b/app/src/main/res/drawable-anydpi/qweather_2155.xml new file mode 100644 index 0000000..5f4309f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2155.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2156.xml b/app/src/main/res/drawable-anydpi/qweather_2156.xml new file mode 100644 index 0000000..ff54034 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2156.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2157.xml b/app/src/main/res/drawable-anydpi/qweather_2157.xml new file mode 100644 index 0000000..c2b3f92 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2157.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2158.xml b/app/src/main/res/drawable-anydpi/qweather_2158.xml new file mode 100644 index 0000000..463cf7d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2158.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2159.xml b/app/src/main/res/drawable-anydpi/qweather_2159.xml new file mode 100644 index 0000000..1927649 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2159.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2160.xml b/app/src/main/res/drawable-anydpi/qweather_2160.xml new file mode 100644 index 0000000..7491728 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2160.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2161.xml b/app/src/main/res/drawable-anydpi/qweather_2161.xml new file mode 100644 index 0000000..72a95b3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2161.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2162.xml b/app/src/main/res/drawable-anydpi/qweather_2162.xml new file mode 100644 index 0000000..7e7c856 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2162.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2163.xml b/app/src/main/res/drawable-anydpi/qweather_2163.xml new file mode 100644 index 0000000..71182f5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2163.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2164.xml b/app/src/main/res/drawable-anydpi/qweather_2164.xml new file mode 100644 index 0000000..05b2b58 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2164.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2165.xml b/app/src/main/res/drawable-anydpi/qweather_2165.xml new file mode 100644 index 0000000..30aa018 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2165.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2166.xml b/app/src/main/res/drawable-anydpi/qweather_2166.xml new file mode 100644 index 0000000..2184521 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2166.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2167.xml b/app/src/main/res/drawable-anydpi/qweather_2167.xml new file mode 100644 index 0000000..dda3cf0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2167.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2190.xml b/app/src/main/res/drawable-anydpi/qweather_2190.xml new file mode 100644 index 0000000..4b26921 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2190.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2191.xml b/app/src/main/res/drawable-anydpi/qweather_2191.xml new file mode 100644 index 0000000..a69e5c7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2191.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2192.xml b/app/src/main/res/drawable-anydpi/qweather_2192.xml new file mode 100644 index 0000000..abd2c0c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2192.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2193.xml b/app/src/main/res/drawable-anydpi/qweather_2193.xml new file mode 100644 index 0000000..2b09ea9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2193.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2200.xml b/app/src/main/res/drawable-anydpi/qweather_2200.xml new file mode 100644 index 0000000..dab30bb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2200.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2201.xml b/app/src/main/res/drawable-anydpi/qweather_2201.xml new file mode 100644 index 0000000..3949b80 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2201.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2202.xml b/app/src/main/res/drawable-anydpi/qweather_2202.xml new file mode 100644 index 0000000..b573fd5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2202.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2203.xml b/app/src/main/res/drawable-anydpi/qweather_2203.xml new file mode 100644 index 0000000..72e8fc6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2203.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2204.xml b/app/src/main/res/drawable-anydpi/qweather_2204.xml new file mode 100644 index 0000000..e7c20c6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2204.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2205.xml b/app/src/main/res/drawable-anydpi/qweather_2205.xml new file mode 100644 index 0000000..b1becb1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2205.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2207.xml b/app/src/main/res/drawable-anydpi/qweather_2207.xml new file mode 100644 index 0000000..463cf7d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2207.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2208.xml b/app/src/main/res/drawable-anydpi/qweather_2208.xml new file mode 100644 index 0000000..57a6909 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2208.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2209.xml b/app/src/main/res/drawable-anydpi/qweather_2209.xml new file mode 100644 index 0000000..75a2429 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2209.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2210.xml b/app/src/main/res/drawable-anydpi/qweather_2210.xml new file mode 100644 index 0000000..35f8904 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2210.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2211.xml b/app/src/main/res/drawable-anydpi/qweather_2211.xml new file mode 100644 index 0000000..fdaa2f3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2211.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2212.xml b/app/src/main/res/drawable-anydpi/qweather_2212.xml new file mode 100644 index 0000000..c4e998a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2212.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2213.xml b/app/src/main/res/drawable-anydpi/qweather_2213.xml new file mode 100644 index 0000000..228474b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2213.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2214.xml b/app/src/main/res/drawable-anydpi/qweather_2214.xml new file mode 100644 index 0000000..8b6c9e9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2214.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2215.xml b/app/src/main/res/drawable-anydpi/qweather_2215.xml new file mode 100644 index 0000000..dbe10d5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2215.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2216.xml b/app/src/main/res/drawable-anydpi/qweather_2216.xml new file mode 100644 index 0000000..885c050 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2216.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2217.xml b/app/src/main/res/drawable-anydpi/qweather_2217.xml new file mode 100644 index 0000000..4c21497 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2217.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2218.xml b/app/src/main/res/drawable-anydpi/qweather_2218.xml new file mode 100644 index 0000000..de4c488 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2218.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2300.xml b/app/src/main/res/drawable-anydpi/qweather_2300.xml new file mode 100644 index 0000000..b4b7b9b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2300.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2301.xml b/app/src/main/res/drawable-anydpi/qweather_2301.xml new file mode 100644 index 0000000..434ea24 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2301.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2302.xml b/app/src/main/res/drawable-anydpi/qweather_2302.xml new file mode 100644 index 0000000..7962a38 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2302.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2303.xml b/app/src/main/res/drawable-anydpi/qweather_2303.xml new file mode 100644 index 0000000..054a3e3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2303.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2304.xml b/app/src/main/res/drawable-anydpi/qweather_2304.xml new file mode 100644 index 0000000..d19f775 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2304.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2305.xml b/app/src/main/res/drawable-anydpi/qweather_2305.xml new file mode 100644 index 0000000..51a4459 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2305.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2306.xml b/app/src/main/res/drawable-anydpi/qweather_2306.xml new file mode 100644 index 0000000..0243d7b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2306.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2307.xml b/app/src/main/res/drawable-anydpi/qweather_2307.xml new file mode 100644 index 0000000..0e42578 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2307.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2308.xml b/app/src/main/res/drawable-anydpi/qweather_2308.xml new file mode 100644 index 0000000..5b9114e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2308.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2309.xml b/app/src/main/res/drawable-anydpi/qweather_2309.xml new file mode 100644 index 0000000..67bbbbd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2309.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2311.xml b/app/src/main/res/drawable-anydpi/qweather_2311.xml new file mode 100644 index 0000000..61f6797 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2311.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2312.xml b/app/src/main/res/drawable-anydpi/qweather_2312.xml new file mode 100644 index 0000000..f932f60 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2312.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2313.xml b/app/src/main/res/drawable-anydpi/qweather_2313.xml new file mode 100644 index 0000000..787e952 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2313.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2314.xml b/app/src/main/res/drawable-anydpi/qweather_2314.xml new file mode 100644 index 0000000..e1ecd90 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2314.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2315.xml b/app/src/main/res/drawable-anydpi/qweather_2315.xml new file mode 100644 index 0000000..11d252a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2315.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2316.xml b/app/src/main/res/drawable-anydpi/qweather_2316.xml new file mode 100644 index 0000000..3c01bef --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2316.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2317.xml b/app/src/main/res/drawable-anydpi/qweather_2317.xml new file mode 100644 index 0000000..3749af7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2317.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2318.xml b/app/src/main/res/drawable-anydpi/qweather_2318.xml new file mode 100644 index 0000000..32954cb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2318.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2319.xml b/app/src/main/res/drawable-anydpi/qweather_2319.xml new file mode 100644 index 0000000..6fb4fa6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2319.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2320.xml b/app/src/main/res/drawable-anydpi/qweather_2320.xml new file mode 100644 index 0000000..2474413 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2320.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2321.xml b/app/src/main/res/drawable-anydpi/qweather_2321.xml new file mode 100644 index 0000000..75bf724 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2321.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2322.xml b/app/src/main/res/drawable-anydpi/qweather_2322.xml new file mode 100644 index 0000000..51fcff5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2322.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2323.xml b/app/src/main/res/drawable-anydpi/qweather_2323.xml new file mode 100644 index 0000000..5d0a750 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2323.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2324.xml b/app/src/main/res/drawable-anydpi/qweather_2324.xml new file mode 100644 index 0000000..27fa9de --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2324.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2325.xml b/app/src/main/res/drawable-anydpi/qweather_2325.xml new file mode 100644 index 0000000..7116c75 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2325.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2326.xml b/app/src/main/res/drawable-anydpi/qweather_2326.xml new file mode 100644 index 0000000..c95a6b9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2326.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2327.xml b/app/src/main/res/drawable-anydpi/qweather_2327.xml new file mode 100644 index 0000000..6f98a74 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2327.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2328.xml b/app/src/main/res/drawable-anydpi/qweather_2328.xml new file mode 100644 index 0000000..8958caa --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2328.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2330.xml b/app/src/main/res/drawable-anydpi/qweather_2330.xml new file mode 100644 index 0000000..9c0c18f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2330.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2331.xml b/app/src/main/res/drawable-anydpi/qweather_2331.xml new file mode 100644 index 0000000..7dbc734 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2331.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2332.xml b/app/src/main/res/drawable-anydpi/qweather_2332.xml new file mode 100644 index 0000000..e795f13 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2332.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2333.xml b/app/src/main/res/drawable-anydpi/qweather_2333.xml new file mode 100644 index 0000000..67af473 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2333.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2341.xml b/app/src/main/res/drawable-anydpi/qweather_2341.xml new file mode 100644 index 0000000..436964f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2341.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2343.xml b/app/src/main/res/drawable-anydpi/qweather_2343.xml new file mode 100644 index 0000000..99e0a23 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2343.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2345.xml b/app/src/main/res/drawable-anydpi/qweather_2345.xml new file mode 100644 index 0000000..0008aa8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2345.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2346.xml b/app/src/main/res/drawable-anydpi/qweather_2346.xml new file mode 100644 index 0000000..2703fa3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2346.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2348.xml b/app/src/main/res/drawable-anydpi/qweather_2348.xml new file mode 100644 index 0000000..0918f10 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2348.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2349.xml b/app/src/main/res/drawable-anydpi/qweather_2349.xml new file mode 100644 index 0000000..0f15bdc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2349.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2350.xml b/app/src/main/res/drawable-anydpi/qweather_2350.xml new file mode 100644 index 0000000..b838a04 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2350.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2351.xml b/app/src/main/res/drawable-anydpi/qweather_2351.xml new file mode 100644 index 0000000..d19f775 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2351.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2352.xml b/app/src/main/res/drawable-anydpi/qweather_2352.xml new file mode 100644 index 0000000..5ab30fe --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2352.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2353.xml b/app/src/main/res/drawable-anydpi/qweather_2353.xml new file mode 100644 index 0000000..804e204 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2353.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2354.xml b/app/src/main/res/drawable-anydpi/qweather_2354.xml new file mode 100644 index 0000000..8c5770b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2354.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2355.xml b/app/src/main/res/drawable-anydpi/qweather_2355.xml new file mode 100644 index 0000000..3f38451 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2355.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2356.xml b/app/src/main/res/drawable-anydpi/qweather_2356.xml new file mode 100644 index 0000000..768bdc1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2356.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2357.xml b/app/src/main/res/drawable-anydpi/qweather_2357.xml new file mode 100644 index 0000000..35fd1d5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2357.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2358.xml b/app/src/main/res/drawable-anydpi/qweather_2358.xml new file mode 100644 index 0000000..54b4556 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2358.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2359.xml b/app/src/main/res/drawable-anydpi/qweather_2359.xml new file mode 100644 index 0000000..38493e8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2359.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2360.xml b/app/src/main/res/drawable-anydpi/qweather_2360.xml new file mode 100644 index 0000000..6587af2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2360.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2361.xml b/app/src/main/res/drawable-anydpi/qweather_2361.xml new file mode 100644 index 0000000..6620a0a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2361.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2362.xml b/app/src/main/res/drawable-anydpi/qweather_2362.xml new file mode 100644 index 0000000..b338fc2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2362.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2363.xml b/app/src/main/res/drawable-anydpi/qweather_2363.xml new file mode 100644 index 0000000..10425e0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2363.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2364.xml b/app/src/main/res/drawable-anydpi/qweather_2364.xml new file mode 100644 index 0000000..51de3d1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2364.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2365.xml b/app/src/main/res/drawable-anydpi/qweather_2365.xml new file mode 100644 index 0000000..b7dea89 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2365.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2366.xml b/app/src/main/res/drawable-anydpi/qweather_2366.xml new file mode 100644 index 0000000..ac92415 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2366.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2367.xml b/app/src/main/res/drawable-anydpi/qweather_2367.xml new file mode 100644 index 0000000..f2c91ae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2367.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2368.xml b/app/src/main/res/drawable-anydpi/qweather_2368.xml new file mode 100644 index 0000000..08e56cc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2368.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2369.xml b/app/src/main/res/drawable-anydpi/qweather_2369.xml new file mode 100644 index 0000000..a27cc48 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2369.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2370.xml b/app/src/main/res/drawable-anydpi/qweather_2370.xml new file mode 100644 index 0000000..b701607 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2370.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2371.xml b/app/src/main/res/drawable-anydpi/qweather_2371.xml new file mode 100644 index 0000000..9f8ecde --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2371.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2372.xml b/app/src/main/res/drawable-anydpi/qweather_2372.xml new file mode 100644 index 0000000..02685a0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2372.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2373.xml b/app/src/main/res/drawable-anydpi/qweather_2373.xml new file mode 100644 index 0000000..a04ecbc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2373.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2374.xml b/app/src/main/res/drawable-anydpi/qweather_2374.xml new file mode 100644 index 0000000..9e8e641 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2374.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2375.xml b/app/src/main/res/drawable-anydpi/qweather_2375.xml new file mode 100644 index 0000000..a762ffc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2375.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2376.xml b/app/src/main/res/drawable-anydpi/qweather_2376.xml new file mode 100644 index 0000000..33b4658 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2376.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2377.xml b/app/src/main/res/drawable-anydpi/qweather_2377.xml new file mode 100644 index 0000000..9e27ec3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2377.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2378.xml b/app/src/main/res/drawable-anydpi/qweather_2378.xml new file mode 100644 index 0000000..2474413 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2378.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2379.xml b/app/src/main/res/drawable-anydpi/qweather_2379.xml new file mode 100644 index 0000000..8fc32d3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2379.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2380.xml b/app/src/main/res/drawable-anydpi/qweather_2380.xml new file mode 100644 index 0000000..a83e9e3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2380.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2381.xml b/app/src/main/res/drawable-anydpi/qweather_2381.xml new file mode 100644 index 0000000..a0bd56c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2381.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2382.xml b/app/src/main/res/drawable-anydpi/qweather_2382.xml new file mode 100644 index 0000000..d8604ab --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2382.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2383.xml b/app/src/main/res/drawable-anydpi/qweather_2383.xml new file mode 100644 index 0000000..f4acaf0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2383.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2384.xml b/app/src/main/res/drawable-anydpi/qweather_2384.xml new file mode 100644 index 0000000..9588a94 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2384.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2385.xml b/app/src/main/res/drawable-anydpi/qweather_2385.xml new file mode 100644 index 0000000..c6932c1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2385.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2386.xml b/app/src/main/res/drawable-anydpi/qweather_2386.xml new file mode 100644 index 0000000..02479e5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2386.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2387.xml b/app/src/main/res/drawable-anydpi/qweather_2387.xml new file mode 100644 index 0000000..c6a528e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2387.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2388.xml b/app/src/main/res/drawable-anydpi/qweather_2388.xml new file mode 100644 index 0000000..99ec68b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2388.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2389.xml b/app/src/main/res/drawable-anydpi/qweather_2389.xml new file mode 100644 index 0000000..e2f0d32 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2389.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2390.xml b/app/src/main/res/drawable-anydpi/qweather_2390.xml new file mode 100644 index 0000000..f06300a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2390.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2391.xml b/app/src/main/res/drawable-anydpi/qweather_2391.xml new file mode 100644 index 0000000..bdbda3c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2391.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2392.xml b/app/src/main/res/drawable-anydpi/qweather_2392.xml new file mode 100644 index 0000000..ceeead0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2392.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2393.xml b/app/src/main/res/drawable-anydpi/qweather_2393.xml new file mode 100644 index 0000000..b92940c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2393.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2394.xml b/app/src/main/res/drawable-anydpi/qweather_2394.xml new file mode 100644 index 0000000..4bfc658 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2394.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2395.xml b/app/src/main/res/drawable-anydpi/qweather_2395.xml new file mode 100644 index 0000000..74a7097 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2395.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2396.xml b/app/src/main/res/drawable-anydpi/qweather_2396.xml new file mode 100644 index 0000000..b517c57 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2396.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2397.xml b/app/src/main/res/drawable-anydpi/qweather_2397.xml new file mode 100644 index 0000000..3262439 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2397.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2398.xml b/app/src/main/res/drawable-anydpi/qweather_2398.xml new file mode 100644 index 0000000..aaaac1c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2398.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2399.xml b/app/src/main/res/drawable-anydpi/qweather_2399.xml new file mode 100644 index 0000000..76bbef3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2399.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2400.xml b/app/src/main/res/drawable-anydpi/qweather_2400.xml new file mode 100644 index 0000000..b9343c2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2400.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2409.xml b/app/src/main/res/drawable-anydpi/qweather_2409.xml new file mode 100644 index 0000000..5c57a15 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2409.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2411.xml b/app/src/main/res/drawable-anydpi/qweather_2411.xml new file mode 100644 index 0000000..895a23d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2411.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2412.xml b/app/src/main/res/drawable-anydpi/qweather_2412.xml new file mode 100644 index 0000000..3285bf6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2412.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2413.xml b/app/src/main/res/drawable-anydpi/qweather_2413.xml new file mode 100644 index 0000000..7e7514a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2413.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2414.xml b/app/src/main/res/drawable-anydpi/qweather_2414.xml new file mode 100644 index 0000000..21b3dfb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2414.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2415.xml b/app/src/main/res/drawable-anydpi/qweather_2415.xml new file mode 100644 index 0000000..7465327 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2415.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2416.xml b/app/src/main/res/drawable-anydpi/qweather_2416.xml new file mode 100644 index 0000000..79dcfd6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2416.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2417.xml b/app/src/main/res/drawable-anydpi/qweather_2417.xml new file mode 100644 index 0000000..f408dca --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2417.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2418.xml b/app/src/main/res/drawable-anydpi/qweather_2418.xml new file mode 100644 index 0000000..a2bc97f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2418.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2419.xml b/app/src/main/res/drawable-anydpi/qweather_2419.xml new file mode 100644 index 0000000..82e0f46 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2419.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2420.xml b/app/src/main/res/drawable-anydpi/qweather_2420.xml new file mode 100644 index 0000000..83696a0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2420.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2421.xml b/app/src/main/res/drawable-anydpi/qweather_2421.xml new file mode 100644 index 0000000..c87f1d3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2421.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2422.xml b/app/src/main/res/drawable-anydpi/qweather_2422.xml new file mode 100644 index 0000000..3a56acb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2422.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2423.xml b/app/src/main/res/drawable-anydpi/qweather_2423.xml new file mode 100644 index 0000000..d876220 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2423.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2424.xml b/app/src/main/res/drawable-anydpi/qweather_2424.xml new file mode 100644 index 0000000..a4045a0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2424.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2425.xml b/app/src/main/res/drawable-anydpi/qweather_2425.xml new file mode 100644 index 0000000..a442561 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2425.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2426.xml b/app/src/main/res/drawable-anydpi/qweather_2426.xml new file mode 100644 index 0000000..676f58d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2426.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2501.xml b/app/src/main/res/drawable-anydpi/qweather_2501.xml new file mode 100644 index 0000000..a24365a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2501.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2502.xml b/app/src/main/res/drawable-anydpi/qweather_2502.xml new file mode 100644 index 0000000..6cc3053 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2502.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2521.xml b/app/src/main/res/drawable-anydpi/qweather_2521.xml new file mode 100644 index 0000000..5b3116b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2521.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2522.xml b/app/src/main/res/drawable-anydpi/qweather_2522.xml new file mode 100644 index 0000000..d5eca17 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2522.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2523.xml b/app/src/main/res/drawable-anydpi/qweather_2523.xml new file mode 100644 index 0000000..0df7fff --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2523.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2524.xml b/app/src/main/res/drawable-anydpi/qweather_2524.xml new file mode 100644 index 0000000..1aa8d60 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2524.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2525.xml b/app/src/main/res/drawable-anydpi/qweather_2525.xml new file mode 100644 index 0000000..019fd73 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2525.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2526.xml b/app/src/main/res/drawable-anydpi/qweather_2526.xml new file mode 100644 index 0000000..f0de8fa --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2526.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2527.xml b/app/src/main/res/drawable-anydpi/qweather_2527.xml new file mode 100644 index 0000000..d139a37 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2527.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2528.xml b/app/src/main/res/drawable-anydpi/qweather_2528.xml new file mode 100644 index 0000000..f0de8fa --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2528.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2529.xml b/app/src/main/res/drawable-anydpi/qweather_2529.xml new file mode 100644 index 0000000..86250f9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2529.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2530.xml b/app/src/main/res/drawable-anydpi/qweather_2530.xml new file mode 100644 index 0000000..c223a4c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2530.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2531.xml b/app/src/main/res/drawable-anydpi/qweather_2531.xml new file mode 100644 index 0000000..99b215f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2531.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2532.xml b/app/src/main/res/drawable-anydpi/qweather_2532.xml new file mode 100644 index 0000000..1aa8d60 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2532.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2550.xml b/app/src/main/res/drawable-anydpi/qweather_2550.xml new file mode 100644 index 0000000..a6d3c0b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2550.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2551.xml b/app/src/main/res/drawable-anydpi/qweather_2551.xml new file mode 100644 index 0000000..48006d2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2551.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2552.xml b/app/src/main/res/drawable-anydpi/qweather_2552.xml new file mode 100644 index 0000000..d6bf6f9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2552.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2553.xml b/app/src/main/res/drawable-anydpi/qweather_2553.xml new file mode 100644 index 0000000..24388bf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2553.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_2554.xml b/app/src/main/res/drawable-anydpi/qweather_2554.xml new file mode 100644 index 0000000..5bf95fc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_2554.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_300.xml b/app/src/main/res/drawable-anydpi/qweather_300.xml new file mode 100644 index 0000000..96c7390 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_300.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_300_fill.xml b/app/src/main/res/drawable-anydpi/qweather_300_fill.xml new file mode 100644 index 0000000..358ba9e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_300_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_301.xml b/app/src/main/res/drawable-anydpi/qweather_301.xml new file mode 100644 index 0000000..c3e206a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_301.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_301_fill.xml b/app/src/main/res/drawable-anydpi/qweather_301_fill.xml new file mode 100644 index 0000000..53500cf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_301_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_302.xml b/app/src/main/res/drawable-anydpi/qweather_302.xml new file mode 100644 index 0000000..c3a8cb0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_302.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_302_fill.xml b/app/src/main/res/drawable-anydpi/qweather_302_fill.xml new file mode 100644 index 0000000..dd58d6a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_302_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_303.xml b/app/src/main/res/drawable-anydpi/qweather_303.xml new file mode 100644 index 0000000..403adf9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_303.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_303_fill.xml b/app/src/main/res/drawable-anydpi/qweather_303_fill.xml new file mode 100644 index 0000000..10f2d6a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_303_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_304.xml b/app/src/main/res/drawable-anydpi/qweather_304.xml new file mode 100644 index 0000000..a90382c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_304.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_304_fill.xml b/app/src/main/res/drawable-anydpi/qweather_304_fill.xml new file mode 100644 index 0000000..eef74dd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_304_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_305.xml b/app/src/main/res/drawable-anydpi/qweather_305.xml new file mode 100644 index 0000000..460a341 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_305.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_305_fill.xml b/app/src/main/res/drawable-anydpi/qweather_305_fill.xml new file mode 100644 index 0000000..c14404b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_305_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_306.xml b/app/src/main/res/drawable-anydpi/qweather_306.xml new file mode 100644 index 0000000..70458d4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_306.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_306_fill.xml b/app/src/main/res/drawable-anydpi/qweather_306_fill.xml new file mode 100644 index 0000000..36a8add --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_306_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_307.xml b/app/src/main/res/drawable-anydpi/qweather_307.xml new file mode 100644 index 0000000..c91b754 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_307.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_307_fill.xml b/app/src/main/res/drawable-anydpi/qweather_307_fill.xml new file mode 100644 index 0000000..e20594c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_307_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_308.xml b/app/src/main/res/drawable-anydpi/qweather_308.xml new file mode 100644 index 0000000..300ea58 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_308.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_308_fill.xml b/app/src/main/res/drawable-anydpi/qweather_308_fill.xml new file mode 100644 index 0000000..81538e2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_308_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_309.xml b/app/src/main/res/drawable-anydpi/qweather_309.xml new file mode 100644 index 0000000..4e169e9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_309.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_309_fill.xml b/app/src/main/res/drawable-anydpi/qweather_309_fill.xml new file mode 100644 index 0000000..9abd981 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_309_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_310.xml b/app/src/main/res/drawable-anydpi/qweather_310.xml new file mode 100644 index 0000000..9f1451c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_310.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_310_fill.xml b/app/src/main/res/drawable-anydpi/qweather_310_fill.xml new file mode 100644 index 0000000..58a10cf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_310_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_311.xml b/app/src/main/res/drawable-anydpi/qweather_311.xml new file mode 100644 index 0000000..657abfd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_311.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_311_fill.xml b/app/src/main/res/drawable-anydpi/qweather_311_fill.xml new file mode 100644 index 0000000..ae8a6a6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_311_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_312.xml b/app/src/main/res/drawable-anydpi/qweather_312.xml new file mode 100644 index 0000000..60bc63e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_312.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_312_fill.xml b/app/src/main/res/drawable-anydpi/qweather_312_fill.xml new file mode 100644 index 0000000..d97bdbc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_312_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_313.xml b/app/src/main/res/drawable-anydpi/qweather_313.xml new file mode 100644 index 0000000..158dbc0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_313.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_313_fill.xml b/app/src/main/res/drawable-anydpi/qweather_313_fill.xml new file mode 100644 index 0000000..f805e3f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_313_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_314.xml b/app/src/main/res/drawable-anydpi/qweather_314.xml new file mode 100644 index 0000000..30eac7f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_314.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_314_fill.xml b/app/src/main/res/drawable-anydpi/qweather_314_fill.xml new file mode 100644 index 0000000..cf3403b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_314_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_315.xml b/app/src/main/res/drawable-anydpi/qweather_315.xml new file mode 100644 index 0000000..0aa9623 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_315.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_315_fill.xml b/app/src/main/res/drawable-anydpi/qweather_315_fill.xml new file mode 100644 index 0000000..315bb86 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_315_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_316.xml b/app/src/main/res/drawable-anydpi/qweather_316.xml new file mode 100644 index 0000000..d05ff3e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_316.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_316_fill.xml b/app/src/main/res/drawable-anydpi/qweather_316_fill.xml new file mode 100644 index 0000000..b5996ec --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_316_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_317.xml b/app/src/main/res/drawable-anydpi/qweather_317.xml new file mode 100644 index 0000000..917d6da --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_317.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_317_fill.xml b/app/src/main/res/drawable-anydpi/qweather_317_fill.xml new file mode 100644 index 0000000..5be0316 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_317_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_318.xml b/app/src/main/res/drawable-anydpi/qweather_318.xml new file mode 100644 index 0000000..58def9b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_318.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_318_fill.xml b/app/src/main/res/drawable-anydpi/qweather_318_fill.xml new file mode 100644 index 0000000..244ebcc --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_318_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_350.xml b/app/src/main/res/drawable-anydpi/qweather_350.xml new file mode 100644 index 0000000..fc48cbb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_350.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_350_fill.xml b/app/src/main/res/drawable-anydpi/qweather_350_fill.xml new file mode 100644 index 0000000..87302c6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_350_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_351.xml b/app/src/main/res/drawable-anydpi/qweather_351.xml new file mode 100644 index 0000000..516212c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_351.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_351_fill.xml b/app/src/main/res/drawable-anydpi/qweather_351_fill.xml new file mode 100644 index 0000000..536b256 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_351_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_399.xml b/app/src/main/res/drawable-anydpi/qweather_399.xml new file mode 100644 index 0000000..de23ce5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_399.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_399_fill.xml b/app/src/main/res/drawable-anydpi/qweather_399_fill.xml new file mode 100644 index 0000000..6a5c8c6 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_399_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_400.xml b/app/src/main/res/drawable-anydpi/qweather_400.xml new file mode 100644 index 0000000..fb5e727 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_400.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_400_fill.xml b/app/src/main/res/drawable-anydpi/qweather_400_fill.xml new file mode 100644 index 0000000..07e718d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_400_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_401.xml b/app/src/main/res/drawable-anydpi/qweather_401.xml new file mode 100644 index 0000000..80a2f39 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_401.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_401_fill.xml b/app/src/main/res/drawable-anydpi/qweather_401_fill.xml new file mode 100644 index 0000000..fc22a1b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_401_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_402.xml b/app/src/main/res/drawable-anydpi/qweather_402.xml new file mode 100644 index 0000000..0b7972a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_402.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_402_fill.xml b/app/src/main/res/drawable-anydpi/qweather_402_fill.xml new file mode 100644 index 0000000..25ffa10 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_402_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_403.xml b/app/src/main/res/drawable-anydpi/qweather_403.xml new file mode 100644 index 0000000..b5b2ebf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_403.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_403_fill.xml b/app/src/main/res/drawable-anydpi/qweather_403_fill.xml new file mode 100644 index 0000000..e6160e2 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_403_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_404.xml b/app/src/main/res/drawable-anydpi/qweather_404.xml new file mode 100644 index 0000000..1e975ae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_404.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_404_fill.xml b/app/src/main/res/drawable-anydpi/qweather_404_fill.xml new file mode 100644 index 0000000..084a33b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_404_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_405.xml b/app/src/main/res/drawable-anydpi/qweather_405.xml new file mode 100644 index 0000000..a43b9e8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_405.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_405_fill.xml b/app/src/main/res/drawable-anydpi/qweather_405_fill.xml new file mode 100644 index 0000000..572f7dd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_405_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_406.xml b/app/src/main/res/drawable-anydpi/qweather_406.xml new file mode 100644 index 0000000..e5eff6d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_406.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_406_fill.xml b/app/src/main/res/drawable-anydpi/qweather_406_fill.xml new file mode 100644 index 0000000..d497ab8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_406_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_407.xml b/app/src/main/res/drawable-anydpi/qweather_407.xml new file mode 100644 index 0000000..3c4a431 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_407.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_407_fill.xml b/app/src/main/res/drawable-anydpi/qweather_407_fill.xml new file mode 100644 index 0000000..970e97c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_407_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_408.xml b/app/src/main/res/drawable-anydpi/qweather_408.xml new file mode 100644 index 0000000..152701b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_408.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_408_fill.xml b/app/src/main/res/drawable-anydpi/qweather_408_fill.xml new file mode 100644 index 0000000..6798af4 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_408_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_409.xml b/app/src/main/res/drawable-anydpi/qweather_409.xml new file mode 100644 index 0000000..d3b591a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_409.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_409_fill.xml b/app/src/main/res/drawable-anydpi/qweather_409_fill.xml new file mode 100644 index 0000000..6f92006 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_409_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_410.xml b/app/src/main/res/drawable-anydpi/qweather_410.xml new file mode 100644 index 0000000..d63ecc7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_410.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_410_fill.xml b/app/src/main/res/drawable-anydpi/qweather_410_fill.xml new file mode 100644 index 0000000..6e1a612 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_410_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_456.xml b/app/src/main/res/drawable-anydpi/qweather_456.xml new file mode 100644 index 0000000..1bffa71 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_456.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_456_fill.xml b/app/src/main/res/drawable-anydpi/qweather_456_fill.xml new file mode 100644 index 0000000..e9080ec --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_456_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_457.xml b/app/src/main/res/drawable-anydpi/qweather_457.xml new file mode 100644 index 0000000..6ea46e0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_457.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_457_fill.xml b/app/src/main/res/drawable-anydpi/qweather_457_fill.xml new file mode 100644 index 0000000..aced2cb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_457_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_499.xml b/app/src/main/res/drawable-anydpi/qweather_499.xml new file mode 100644 index 0000000..a5662f1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_499.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_499_fill.xml b/app/src/main/res/drawable-anydpi/qweather_499_fill.xml new file mode 100644 index 0000000..f27af7d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_499_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_500.xml b/app/src/main/res/drawable-anydpi/qweather_500.xml new file mode 100644 index 0000000..98e9e95 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_500.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_500_fill.xml b/app/src/main/res/drawable-anydpi/qweather_500_fill.xml new file mode 100644 index 0000000..0450a82 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_500_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_501.xml b/app/src/main/res/drawable-anydpi/qweather_501.xml new file mode 100644 index 0000000..8764aae --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_501.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_501_fill.xml b/app/src/main/res/drawable-anydpi/qweather_501_fill.xml new file mode 100644 index 0000000..e83bbfe --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_501_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_502.xml b/app/src/main/res/drawable-anydpi/qweather_502.xml new file mode 100644 index 0000000..ed67b07 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_502.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_502_fill.xml b/app/src/main/res/drawable-anydpi/qweather_502_fill.xml new file mode 100644 index 0000000..fd1906b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_502_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_503.xml b/app/src/main/res/drawable-anydpi/qweather_503.xml new file mode 100644 index 0000000..15e4f55 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_503.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_503_fill.xml b/app/src/main/res/drawable-anydpi/qweather_503_fill.xml new file mode 100644 index 0000000..199c368 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_503_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_504.xml b/app/src/main/res/drawable-anydpi/qweather_504.xml new file mode 100644 index 0000000..b88e09f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_504.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_504_fill.xml b/app/src/main/res/drawable-anydpi/qweather_504_fill.xml new file mode 100644 index 0000000..d357a90 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_504_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_507.xml b/app/src/main/res/drawable-anydpi/qweather_507.xml new file mode 100644 index 0000000..540ad5b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_507.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_507_fill.xml b/app/src/main/res/drawable-anydpi/qweather_507_fill.xml new file mode 100644 index 0000000..05b2b58 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_507_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_508.xml b/app/src/main/res/drawable-anydpi/qweather_508.xml new file mode 100644 index 0000000..ab071d9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_508.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_508_fill.xml b/app/src/main/res/drawable-anydpi/qweather_508_fill.xml new file mode 100644 index 0000000..38718ab --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_508_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_509.xml b/app/src/main/res/drawable-anydpi/qweather_509.xml new file mode 100644 index 0000000..e55fa75 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_509.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_509_fill.xml b/app/src/main/res/drawable-anydpi/qweather_509_fill.xml new file mode 100644 index 0000000..46bb372 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_509_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_510.xml b/app/src/main/res/drawable-anydpi/qweather_510.xml new file mode 100644 index 0000000..18a4f11 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_510.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_510_fill.xml b/app/src/main/res/drawable-anydpi/qweather_510_fill.xml new file mode 100644 index 0000000..1ffbd67 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_510_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_511.xml b/app/src/main/res/drawable-anydpi/qweather_511.xml new file mode 100644 index 0000000..7c5ca98 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_511.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_511_fill.xml b/app/src/main/res/drawable-anydpi/qweather_511_fill.xml new file mode 100644 index 0000000..88c70fd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_511_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_512.xml b/app/src/main/res/drawable-anydpi/qweather_512.xml new file mode 100644 index 0000000..f6b9a46 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_512.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_512_fill.xml b/app/src/main/res/drawable-anydpi/qweather_512_fill.xml new file mode 100644 index 0000000..e3a1702 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_512_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_513.xml b/app/src/main/res/drawable-anydpi/qweather_513.xml new file mode 100644 index 0000000..64688cf --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_513.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_513_fill.xml b/app/src/main/res/drawable-anydpi/qweather_513_fill.xml new file mode 100644 index 0000000..714f096 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_513_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_514.xml b/app/src/main/res/drawable-anydpi/qweather_514.xml new file mode 100644 index 0000000..105c472 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_514.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_514_fill.xml b/app/src/main/res/drawable-anydpi/qweather_514_fill.xml new file mode 100644 index 0000000..d2a5250 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_514_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_515.xml b/app/src/main/res/drawable-anydpi/qweather_515.xml new file mode 100644 index 0000000..3fbcb3e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_515.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_515_fill.xml b/app/src/main/res/drawable-anydpi/qweather_515_fill.xml new file mode 100644 index 0000000..245c485 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_515_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_800.xml b/app/src/main/res/drawable-anydpi/qweather_800.xml new file mode 100644 index 0000000..3aac98c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_800.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_801.xml b/app/src/main/res/drawable-anydpi/qweather_801.xml new file mode 100644 index 0000000..320b1eb --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_801.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_802.xml b/app/src/main/res/drawable-anydpi/qweather_802.xml new file mode 100644 index 0000000..dbff76b --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_802.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_803.xml b/app/src/main/res/drawable-anydpi/qweather_803.xml new file mode 100644 index 0000000..3be226d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_803.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_804.xml b/app/src/main/res/drawable-anydpi/qweather_804.xml new file mode 100644 index 0000000..b0401c1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_804.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_805.xml b/app/src/main/res/drawable-anydpi/qweather_805.xml new file mode 100644 index 0000000..e45d1ce --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_805.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_806.xml b/app/src/main/res/drawable-anydpi/qweather_806.xml new file mode 100644 index 0000000..2d19b30 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_806.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_807.xml b/app/src/main/res/drawable-anydpi/qweather_807.xml new file mode 100644 index 0000000..0546e24 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_807.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_900.xml b/app/src/main/res/drawable-anydpi/qweather_900.xml new file mode 100644 index 0000000..18402fd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_900.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_900_fill.xml b/app/src/main/res/drawable-anydpi/qweather_900_fill.xml new file mode 100644 index 0000000..a78f8d3 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_900_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_901.xml b/app/src/main/res/drawable-anydpi/qweather_901.xml new file mode 100644 index 0000000..2a93d1c --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_901.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_901_fill.xml b/app/src/main/res/drawable-anydpi/qweather_901_fill.xml new file mode 100644 index 0000000..1e7743a --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_901_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_999.xml b/app/src/main/res/drawable-anydpi/qweather_999.xml new file mode 100644 index 0000000..6df7ad7 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_999.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_9999.xml b/app/src/main/res/drawable-anydpi/qweather_9999.xml new file mode 100644 index 0000000..6b0d5f9 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_9999.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_999_fill.xml b/app/src/main/res/drawable-anydpi/qweather_999_fill.xml new file mode 100644 index 0000000..d12b144 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_999_fill.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_qweather.xml b/app/src/main/res/drawable-anydpi/qweather_qweather.xml new file mode 100644 index 0000000..b33488e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_qweather.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/qweather_qweather_fill.xml b/app/src/main/res/drawable-anydpi/qweather_qweather_fill.xml new file mode 100644 index 0000000..77c380e --- /dev/null +++ b/app/src/main/res/drawable-anydpi/qweather_qweather_fill.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml index 4cdb27e..29816b9 100644 --- a/app/src/main/res/drawable/ic_cancel.xml +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -1,9 +1,27 @@ + + android:fillColor="#FF000000" + android:pathData="M512,177.8c45.1,0 88.9,8.8 130.1,26.2 39.8,16.8 75.5,40.9 106.2,71.6 30.7,30.7 54.8,66.4 71.6,106.2 17.4,41.2 26.2,84.9 26.2,130.1s-8.8,88.9 -26.2,130.1c-16.8,39.8 -40.9,75.5 -71.6,106.2 -30.7,30.7 -66.4,54.8 -106.2,71.6C600.9,837.2 557.2,846 512,846s-88.9,-8.8 -130.1,-26.2c-39.8,-16.8 -75.5,-40.9 -106.2,-71.6 -30.7,-30.7 -54.8,-66.4 -71.6,-106.2 -17.4,-41.2 -26.2,-84.9 -26.2,-130.1s8.8,-88.9 26.2,-130.1c16.8,-39.8 40.9,-75.5 71.6,-106.2s66.4,-54.8 106.2,-71.6c41.2,-17.3 85,-26.2 130.1,-26.2m0,-50c-212.2,0 -384.2,172 -384.2,384.2s172,384.2 384.2,384.2 384.2,-172 384.2,-384.2 -172,-384.2 -384.2,-384.2z" /> + diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml new file mode 100644 index 0000000..565775d --- /dev/null +++ b/app/src/main/res/drawable/ic_clear.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000..89d10bb --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..b3db549 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 0000000..9924b7a --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 0000000..7ca00e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_more_operation.xml b/app/src/main/res/drawable/ic_more_operation.xml new file mode 100644 index 0000000..60e14ea --- /dev/null +++ b/app/src/main/res/drawable/ic_more_operation.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..8dd7188 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/main_hotseat_background.xml b/app/src/main/res/drawable/main_hotseat_background.xml index c8c10ab..8453ee4 100644 --- a/app/src/main/res/drawable/main_hotseat_background.xml +++ b/app/src/main/res/drawable/main_hotseat_background.xml @@ -8,7 +8,7 @@ - + diff --git a/app/src/main/res/drawable/more_operation_bg.xml b/app/src/main/res/drawable/more_operation_bg.xml new file mode 100644 index 0000000..3041459 --- /dev/null +++ b/app/src/main/res/drawable/more_operation_bg.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shadow_bg.xml b/app/src/main/res/drawable/shadow_bg.xml new file mode 100644 index 0000000..cb7a54d --- /dev/null +++ b/app/src/main/res/drawable/shadow_bg.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tv_cancel_background.xml b/app/src/main/res/drawable/tv_cancel_background.xml new file mode 100644 index 0000000..961106d --- /dev/null +++ b/app/src/main/res/drawable/tv_cancel_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tv_delete_background.xml b/app/src/main/res/drawable/tv_delete_background.xml new file mode 100644 index 0000000..af7886c --- /dev/null +++ b/app/src/main/res/drawable/tv_delete_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tv_edit_background.xml b/app/src/main/res/drawable/tv_edit_background.xml new file mode 100644 index 0000000..7ecf183 --- /dev/null +++ b/app/src/main/res/drawable/tv_edit_background.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_app_list.xml b/app/src/main/res/layout/activity_app_list.xml index ae94b40..d9ade39 100644 --- a/app/src/main/res/layout/activity_app_list.xml +++ b/app/src/main/res/layout/activity_app_list.xml @@ -24,8 +24,8 @@ app:layout_constraintTop_toTopOf="parent"> @@ -50,6 +50,7 @@ android:layout_width="@dimen/dp_32" android:layout_height="@dimen/dp_32" android:layout_marginEnd="@dimen/dp_8" + android:onClick="@{click::save}" android:src="@drawable/ic_confirm" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -57,118 +58,201 @@ - - - - + android:layout_height="wrap_content" + android:orientation="vertical"> - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_contact_edit.xml b/app/src/main/res/layout/activity_contact_edit.xml index 046dad0..656fc3b 100644 --- a/app/src/main/res/layout/activity_contact_edit.xml +++ b/app/src/main/res/layout/activity_contact_edit.xml @@ -1,13 +1,18 @@ + + + @@ -49,6 +54,7 @@ android:layout_width="@dimen/dp_32" android:layout_height="@dimen/dp_32" android:layout_marginEnd="@dimen/dp_8" + android:onClick="@{click::update}" android:src="@drawable/ic_confirm" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -56,5 +62,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_contact_list.xml b/app/src/main/res/layout/activity_contact_list.xml index 22cb149..b091856 100644 --- a/app/src/main/res/layout/activity_contact_list.xml +++ b/app/src/main/res/layout/activity_contact_list.xml @@ -24,8 +24,8 @@ app:layout_constraintTop_toTopOf="parent"> + + - + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +