diff --git a/app/build.gradle b/app/build.gradle index 1cc3bd1..9e1727e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,8 +45,8 @@ android { productFlavors { official { flavorDimensions "default" - versionCode 62 - versionName "7.1" + versionCode 71 + versionName "8.0" } } @@ -190,8 +190,8 @@ dependencies { implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //1.0.5及以前版本的老用户升级需谨慎,API改动过大 implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0' //没有使用特殊Header,可以不加这行 //glide - implementation 'com.github.bumptech.glide:glide:4.13.2' - annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' + implementation 'com.github.bumptech.glide:glide:4.14.2' + annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' //磁盘缓存 implementation 'com.jakewharton:disklrucache:2.0.2' //aria @@ -200,7 +200,7 @@ dependencies { //动态权限框架 implementation 'com.hjq:xxpermissions:6.0' //okhttp - implementation 'com.squareup.okhttp3:okhttp:4.9.1' + implementation 'com.squareup.okhttp3:okhttp:4.9.3' //Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' @@ -227,7 +227,7 @@ dependencies { //更换字体框架 implementation 'uk.co.chrisjenx:calligraphy:2.3.0' //工具类 - implementation 'com.blankj:utilcodex:1.31.0' + implementation 'com.blankj:utilcodex:1.31.1' //沉浸状态栏 implementation 'com.gitee.zackratos:UltimateBarX:0.8.0' } diff --git a/app/src/main/java/com/uiui/appstore/activity/DetailsActivity.java b/app/src/main/java/com/uiui/appstore/activity/DetailsActivity.java index 384d51d..1cc6e0b 100644 --- a/app/src/main/java/com/uiui/appstore/activity/DetailsActivity.java +++ b/app/src/main/java/com/uiui/appstore/activity/DetailsActivity.java @@ -52,7 +52,6 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class DetailsActivity extends BaseActivity { private static final String TAG = DetailsActivity.class.getSimpleName(); - @BindView(R.id.detail_tv_title) TextView tv_title; @BindView(R.id.detail_tv_name) @@ -86,6 +85,9 @@ public class DetailsActivity extends BaseActivity { private installReceiver myReceiver; private AppInfo appInfo; + boolean installed; + boolean update; + @Override protected int setLayoutResourceID() { return R.layout.activity_details; @@ -94,16 +96,13 @@ public class DetailsActivity extends BaseActivity { @Override protected void initView() { ButterKnife.bind(this); + Aria.download(this).register(); rv_image.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); CustomSnapHelper snapHelper = new CustomSnapHelper(); snapHelper.attachToRecyclerView(rv_image); imageAdapter = new ImageAdapter(); rv_image.setAdapter(imageAdapter); - } - @Override - protected void initData() { - Aria.download(this).register(); appInfo = (AppInfo) getIntent().getSerializableExtra("appinfo"); if (appInfo == null) { ToastUtil.show("获取引用信息失败,返回重试"); @@ -111,12 +110,6 @@ public class DetailsActivity extends BaseActivity { } else { getPackageApp(appInfo.getApp_package(), appInfo.getApp_version_code()); } -// final DownloadTask downloadTask = OkDownload.getInstance().getTask(appInfo.getApp_url()); -// if (downloadTask != null) { -// downloadTask.register(new FileDownloadListener(appInfo.getApp_url())); -// refresh(downloadTask.progress); -// } -// tv_title.setText(appInfo.getApp_name()); tv_name.setText(appInfo.getApp_name()); tv_company.setText(appInfo.getApp_developer()); detali_tv_size.setText("大小\t" + "(" + StorageUtils.byteToMB(appInfo.getApp_size()) + ")"); @@ -127,10 +120,13 @@ public class DetailsActivity extends BaseActivity { detali_tv_version.setText("版本:" + appInfo.getApp_version_name()); rating_bar.setRating((float) appInfo.getApp_score()); Glide.with(this).asBitmap().load(appInfo.getApp_img()).transform(new GlideCircleWithBorder(this)).into(iv_icon); - setImage(appInfo); - final boolean installed = ApkUtils.isInstalled(DetailsActivity.this, appInfo.getApp_package()); - final boolean update = ApkUtils.isUpdate(DetailsActivity.this, appInfo.getApp_package(), appInfo.getApp_version_code()); + } + + @Override + protected void initData() { + installed = ApkUtils.isInstalled(DetailsActivity.this, appInfo.getApp_package()); + update = ApkUtils.isUpdate(DetailsActivity.this, appInfo.getApp_package(), appInfo.getApp_version_code()); if (installed) { if (update) { tv_download.setText("更新" + "(" + StorageUtils.byteToMB(appInfo.getApp_size()) + ")"); @@ -358,6 +354,7 @@ public class DetailsActivity extends BaseActivity { if (packageName.equalsIgnoreCase(appInfo.getApp_package())) { tv_download.setText("打开"); } + initData(); } } } diff --git a/app/src/main/java/com/uiui/appstore/activity/MainActivity.java b/app/src/main/java/com/uiui/appstore/activity/MainActivity.java index a8e4aa4..82ff624 100644 --- a/app/src/main/java/com/uiui/appstore/activity/MainActivity.java +++ b/app/src/main/java/com/uiui/appstore/activity/MainActivity.java @@ -3,7 +3,6 @@ package com.uiui.appstore.activity; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; -import android.os.Environment; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -29,9 +28,10 @@ import com.uiui.appstore.fragment.FeaturedFragment; import com.uiui.appstore.fragment.ManageFragment; import com.uiui.appstore.network.NetInterfaceManager; import com.uiui.appstore.service.GuardService; -import com.uiui.appstore.service.main.MainService; import com.uiui.appstore.service.MyDownloadService; import com.uiui.appstore.service.StepService; +import com.uiui.appstore.service.main.MainService; +import com.uiui.appstore.utils.JGYUtils; import com.uiui.appstore.utils.SPUtils; import com.uiui.appstore.utils.ToastUtil; import com.uiui.appstore.utils.Utils; @@ -40,9 +40,9 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; @@ -83,7 +83,7 @@ public class MainActivity extends BaseActivity { @Override protected void onStart() { super.onStart(); - getUserInfo(); +// getUserInfo(); } @Override @@ -183,8 +183,7 @@ public class MainActivity extends BaseActivity { @Override public void hasPermission(List granted, boolean isAll) { if (isAll) { - String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "POStemp"; - File file = new File(path); + File file = new File(JGYUtils.getInstance().getDownLoadPath()); file.mkdirs(); } else { ToastUtil.show("需要授予所有权限才能正常使用本程序!"); @@ -224,8 +223,7 @@ public class MainActivity extends BaseActivity { } } - - synchronized private void getUserInfo() { + private void getUserInfo() { NetInterfaceManager.getInstance().getuserInfoControl().getUserinfo(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -275,7 +273,6 @@ public class MainActivity extends BaseActivity { }); } - private void getAllAppPackageName() { NetInterfaceManager.getInstance() .getQueryAllAppObservable() diff --git a/app/src/main/java/com/uiui/appstore/activity/SearcherActivity.java b/app/src/main/java/com/uiui/appstore/activity/SearcherActivity.java index ab395a4..811e698 100644 --- a/app/src/main/java/com/uiui/appstore/activity/SearcherActivity.java +++ b/app/src/main/java/com/uiui/appstore/activity/SearcherActivity.java @@ -2,6 +2,7 @@ package com.uiui.appstore.activity; import android.os.Handler; import android.os.Message; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; @@ -9,6 +10,7 @@ import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -21,11 +23,14 @@ import com.uiui.appstore.base.BaseActivity; import com.uiui.appstore.bean.AppInfo; import com.uiui.appstore.bean.BaseResponse; import com.uiui.appstore.network.NetInterfaceManager; +import com.uiui.appstore.utils.ToastUtil; import com.uiui.appstore.utils.Utils; import java.util.ArrayList; import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.Disposable; @@ -33,31 +38,36 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class SearcherActivity extends BaseActivity { - private String TAG = SearcherActivity.class.getSimpleName(); - // private SearchView search; + private static final String TAG = SearcherActivity.class.getSimpleName(); private List mAppInfoList = new ArrayList<>(); - private RecyclerView recyclerView; - private AppAdapter madapter; - private EditText edit_search; + + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + @BindView(R.id.edit_search) + EditText edit_search; + @BindView(R.id.iv_back) + ImageView iv_back; + +// @BindView(R.id.search) +// SearchView search; + + AppAdapter madapter; @Override protected int setLayoutResourceID() { return R.layout.activity_searcher; - } @Override protected void initView() { -// search = findViewById(R.id.search); + ButterKnife.bind(this); // int id = search.getContext().getResources().getIdentifier("android:id/search_src_text", null, null); // TextView textView = search.findViewById(androidx.appcompat.R.id.search_src_text); // textView.setTextColor(Color.BLACK); // textView.setHintTextColor(Color.GRAY);//提示字体颜色** - edit_search = findViewById(R.id.edit_search); + edit_search.setImeOptions(EditorInfo.IME_ACTION_SEARCH); edit_search.setInputType(EditorInfo.TYPE_CLASS_TEXT); - - recyclerView = findViewById(R.id.recyclerView); } @Override @@ -88,18 +98,32 @@ public class SearcherActivity extends BaseActivity { edit_search.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { - //do something; - ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) - .hideSoftInputFromWindow(SearcherActivity.this.getCurrentFocus() - .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); - String text = edit_search.getText().toString(); - if (TextUtils.isEmpty(text)) { - getAllAppPackageName(); - } else { - searcheApp(text); + if (actionId == EditorInfo.IME_ACTION_SEND || + (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { + switch (event.getAction()) { + case KeyEvent.ACTION_UP: + //do it + if (actionId == EditorInfo.IME_ACTION_SEND || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { + //do something; + ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) + .hideSoftInputFromWindow(SearcherActivity.this.getCurrentFocus() + .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + String text = edit_search.getText().toString(); + if (TextUtils.isEmpty(text)) { + getAllAppPackageName(); + } else { + int setting_admin_app = Settings.System.getInt(getContentResolver(), "setting_admin_app", 1); + if (setting_admin_app == 0) { + ToastUtil.debugShow("搜索功能已禁用"); + } else { + searcheApp(text); + } + } + } + return true; + default: + return true; } - return true; } return false; } @@ -115,36 +139,38 @@ public class SearcherActivity extends BaseActivity { .subscribe(new Observer>>() { @Override public void onSubscribe(Disposable d) { - + Log.e("searcheApp", "onSubscribe: "); } @Override public void onNext(BaseResponse> listBaseResponse) { + Log.e("searcheApp", "onNext: " + listBaseResponse); if (listBaseResponse.code == 200) { List appInfos = listBaseResponse.data; if (appInfos != null && appInfos.size() > 0) { madapter.setData(listBaseResponse.data); } } else { - madapter.setData(new ArrayList()); + madapter.setData(new ArrayList<>()); + ToastUtil.show("没有搜索到相关应用"); } } @Override public void onError(Throwable e) { - + Log.e("searcheApp", "onError: " + e.getMessage()); } @Override public void onComplete() { - + Log.e("searcheApp", "onComplete: "); } }); } private void getAllAppPackageName() { - NetInterfaceManager.getInstance() - .getQueryAllAppObservable() + NetInterfaceManager.getInstance() + .getQueryAllAppObservable() .subscribe(new Observer>>() { @Override public void onSubscribe(Disposable d) { @@ -175,23 +201,8 @@ public class SearcherActivity extends BaseActivity { }); } - public void finish(View view) { finish(); } - private Handler handler = new Handler() { - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - switch (msg.what) { - case 1: - mAppInfoList = (List) msg.obj; - madapter.setData(mAppInfoList); - madapter.notifyDataSetChanged(); - break; - } - } - }; - } diff --git a/app/src/main/java/com/uiui/appstore/adapter/AppAdapter.java b/app/src/main/java/com/uiui/appstore/adapter/AppAdapter.java index 6667fab..e86c287 100644 --- a/app/src/main/java/com/uiui/appstore/adapter/AppAdapter.java +++ b/app/src/main/java/com/uiui/appstore/adapter/AppAdapter.java @@ -249,7 +249,7 @@ public class AppAdapter extends RecyclerView.Adapter { mDownloadTask = task; // notifyDataSetChanged(); for (int i = 0; i < mAppInfoList.size(); i++) { - if (mAppInfoList.get(i).getApp_url().equals(task.getKey())) { + if (mAppInfoList.get(i).getApp_url().equals(task.getEntity().getUrl())) { notifyItemChanged(i); } } diff --git a/app/src/main/java/com/uiui/appstore/adapter/ClassAdapter.java b/app/src/main/java/com/uiui/appstore/adapter/ClassAdapter.java new file mode 100644 index 0000000..a8886c5 --- /dev/null +++ b/app/src/main/java/com/uiui/appstore/adapter/ClassAdapter.java @@ -0,0 +1,58 @@ +package com.uiui.appstore.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.uiui.appstore.R; +import com.uiui.appstore.bean.AppClassBean; + +import java.util.List; + +public class ClassAdapter extends RecyclerView.Adapter { + private List mAppClassList; + private Context mContext; + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_app_class, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + AppClassBean appClassBean = mAppClassList.get(position); + Glide.with(mContext).load(appClassBean.getImg_url()).error(R.drawable.ic_app).into(holder.mImageView); + } + + @Override + public int getItemCount() { + return mAppClassList == null ? 0 : mAppClassList.size(); + } + + public void setAppClassList(List appClassList) { + this.mAppClassList = appClassList; + notifyDataSetChanged(); + } + + public void claerAppClassList() { + this.mAppClassList = null; + notifyDataSetChanged(); + } + + class Holder extends RecyclerView.ViewHolder { + ImageView mImageView; + + public Holder(@NonNull View itemView) { + super(itemView); + mImageView = itemView.findViewById(R.id.item_iv); + } + } +} diff --git a/app/src/main/java/com/uiui/appstore/base/FilePath.java b/app/src/main/java/com/uiui/appstore/base/FilePath.java deleted file mode 100644 index 545e948..0000000 --- a/app/src/main/java/com/uiui/appstore/base/FilePath.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.uiui.appstore.base; - -import android.os.Environment; - -public class FilePath { - public static final String FileDownloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath(); - -} diff --git a/app/src/main/java/com/uiui/appstore/bean/AppClassBean.java b/app/src/main/java/com/uiui/appstore/bean/AppClassBean.java new file mode 100644 index 0000000..2c4475a --- /dev/null +++ b/app/src/main/java/com/uiui/appstore/bean/AppClassBean.java @@ -0,0 +1,34 @@ +package com.uiui.appstore.bean; + +import java.io.Serializable; + +public class AppClassBean implements Serializable { + private static final long serialVersionUID = -6605991530026729506L; + int id; + String name; + String img_url; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getImg_url() { + return img_url; + } + + public void setImg_url(String img_url) { + this.img_url = img_url; + } +} diff --git a/app/src/main/java/com/uiui/appstore/bean/GlideCircleWithBorder.java b/app/src/main/java/com/uiui/appstore/bean/GlideCircleWithBorder.java index 4d4f723..13de2d8 100644 --- a/app/src/main/java/com/uiui/appstore/bean/GlideCircleWithBorder.java +++ b/app/src/main/java/com/uiui/appstore/bean/GlideCircleWithBorder.java @@ -8,9 +8,9 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; -import com.uiui.appstore.R; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import com.uiui.appstore.R; import java.security.MessageDigest; @@ -37,6 +37,7 @@ public class GlideCircleWithBorder extends BitmapTransformation { // mBorderPaint.setStrokeWidth(mBorderWidth); // } + @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } @@ -90,15 +91,15 @@ public class GlideCircleWithBorder extends BitmapTransformation { paint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas2.drawBitmap(result, 0, 0, paint2); - Bitmap bitmapshadow =BitmapFactory.decodeResource(mContext.getResources(), R.drawable.mask_shadow); - Bitmap bitmap=Bitmap.createScaledBitmap(bitmapshadow,width+2,height+2,true); - Canvas canvas3=new Canvas(); - Paint paint3=new Paint(); - canvas3.setBitmap(bitmap); - canvas3.drawBitmap(bitmapshadow,0,0,paint3); - canvas3.drawBitmap(result2,1,1,paint3); +// Bitmap bitmapshadow = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.mask_shadow); +// Bitmap bitmap = Bitmap.createScaledBitmap(bitmapshadow, width + 2, height + 2, true); +// Canvas canvas3 = new Canvas(); +// Paint paint3 = new Paint(); +// canvas3.setBitmap(bitmap); +// canvas3.drawBitmap(bitmapshadow, 0, 0, paint3); +// canvas3.drawBitmap(result2, 1, 1, paint3); - return bitmap; + return result2; } @Override diff --git a/app/src/main/java/com/uiui/appstore/fragment/FeaturedFragment.java b/app/src/main/java/com/uiui/appstore/fragment/FeaturedFragment.java index 1df4754..4820d74 100644 --- a/app/src/main/java/com/uiui/appstore/fragment/FeaturedFragment.java +++ b/app/src/main/java/com/uiui/appstore/fragment/FeaturedFragment.java @@ -16,6 +16,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; @@ -24,16 +25,18 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; +import com.blankj.utilcode.util.ScreenUtils; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; -import com.uiui.appstore.BuildConfig; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.uiui.appstore.R; -import com.uiui.appstore.activity.HintActivity; import com.uiui.appstore.adapter.AppAdapter; import com.uiui.appstore.adapter.BannerViewHolder; import com.uiui.appstore.base.LazyLoadFragment; import com.uiui.appstore.base.RefreshManager; +import com.uiui.appstore.bean.AppClassBean; import com.uiui.appstore.bean.AppInfo; import com.uiui.appstore.bean.AppInfos; import com.uiui.appstore.bean.Banner; @@ -42,9 +45,6 @@ import com.uiui.appstore.bean.ImageUrl; import com.uiui.appstore.network.NetInterfaceManager; import com.uiui.appstore.utils.LogUtils; import com.uiui.appstore.utils.Utils; -import com.blankj.utilcode.util.ScreenUtils; -import com.bumptech.glide.Glide; -import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.zhpan.bannerview.BannerViewPager; import com.zhpan.bannerview.constants.IndicatorSlideMode; import com.zhpan.bannerview.constants.PageStyle; @@ -56,9 +56,9 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.schedulers.Schedulers; @@ -68,7 +68,8 @@ import io.reactivex.rxjava3.schedulers.Schedulers; */ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager.RefreshInterface { - private String TAG = FeaturedFragment.class.getSimpleName(); + private static final String TAG = FeaturedFragment.class.getSimpleName(); + @BindView(R.id.featured_rv_result) RecyclerView mRvResult; @BindView(R.id.cl) @@ -81,10 +82,21 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager ImageView iv_nodata; @BindView(R.id.banner_view) BannerViewPager mViewPager; + @BindView(R.id.iv_0) + ImageView iv_0; + @BindView(R.id.iv_1) + ImageView iv_1; + @BindView(R.id.iv_2) + ImageView iv_2; + @BindView(R.id.iv_3) + ImageView iv_3; + @BindView(R.id.iv_4) + ImageView iv_4; + private List appInfoList;// private List newAppInfoList = new ArrayList<>(); - private AppAdapter adapter; + private AppAdapter mAppAdapter; private boolean isNotLoadBitmap; public FeaturedFragment() { @@ -131,8 +143,8 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager @Override public void initDatas() { - adapter = new AppAdapter(newAppInfoList, getActivity()); - adapter.setHasStableIds(true); + mAppAdapter = new AppAdapter(newAppInfoList, getActivity()); + mAppAdapter.setHasStableIds(true); int orientation = 0; orientation = getActivity().getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -144,11 +156,11 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager } else { mRvResult.setLayoutManager(new LinearLayoutManager(getActivity())); } - mRvResult.setAdapter(adapter); + mRvResult.setAdapter(mAppAdapter); mRefreshLayout.setEnableLoadMore(false); mRefreshLayout.setEnableRefresh(true); mRefreshLayout.setOnRefreshListener(refreshlayout -> initAPPData()); - adapter.setData(newAppInfoList); + mAppAdapter.setData(newAppInfoList); mRefreshLayout.autoRefresh(); } @@ -177,7 +189,7 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager public void onResume() { super.onResume(); registerReceiver(); - adapter.notifyDataSetChanged(); + mAppAdapter.notifyDataSetChanged(); } @Override @@ -216,7 +228,7 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager || action.equals(Intent.ACTION_PACKAGE_REPLACED) || action.equals(Intent.ACTION_PACKAGE_REMOVED)) { // adapter.setData(checkUpdateOrInstalled(newAppInfoList)); - adapter.notifyDataSetChanged(); + mAppAdapter.notifyDataSetChanged(); Log.e("installReceiver", action); } @@ -231,6 +243,7 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager getAdminApp(); } getBanner(); + getAppClass(); } private void getBanner() { @@ -422,6 +435,57 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager }); } + private void getAppClass() { + NetInterfaceManager.getInstance().getAdminAppClassObservable() + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAppClass", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getAppClass", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List appClassList = listBaseResponse.data; + if (appClassList != null && appClassList.size() != 0) { + setClass(appClassList); + } + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAppClass", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAppClass", "onComplete: "); + } + }); + } + + private void setClass(List appClassList) { + if (appClassList == null || appClassList.size() == 0) { + return; + } + for (int i = 0; i < appClassList.size(); i++) { + AppClassBean appClassBean = appClassList.get(i); + int imageviewId = getActivity().getResources().getIdentifier("iv_" + (i), "id", getActivity().getPackageName()); + int textviewId = getActivity().getResources().getIdentifier("tv_" + (i), "id", getActivity().getPackageName()); + ImageView imageView = getActivity().findViewById(imageviewId); + try { + TextView textView = getActivity().findViewById(textviewId); + Glide.with(getActivity()).load(appClassBean.getImg_url()).error(R.drawable.ic_app).into(imageView); + textView.setText(appClassBean.getName()); + } catch (Exception e) { + Log.e(TAG, "setClass: " + e.getMessage()); + } + } + } + private void setAllAppdata(BaseResponse> listBaseResponse) { int code = listBaseResponse.code; if (code == 200) { @@ -429,8 +493,8 @@ public class FeaturedFragment extends LazyLoadFragment implements RefreshManager newAppInfoList = infos; mRvResult.setVisibility(View.VISIBLE); iv_nodata.setVisibility(View.GONE); - adapter.setData(newAppInfoList); - adapter.notifyDataSetChanged(); + mAppAdapter.setData(newAppInfoList); + mAppAdapter.notifyDataSetChanged(); } else { mRvResult.setVisibility(View.GONE); iv_nodata.setImageDrawable(getActivity().getDrawable(R.drawable.app_nodata)); diff --git a/app/src/main/java/com/uiui/appstore/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/appstore/network/NetInterfaceManager.java index 84be7d2..25ee9a2 100644 --- a/app/src/main/java/com/uiui/appstore/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/appstore/network/NetInterfaceManager.java @@ -11,6 +11,7 @@ import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiui.appstore.bean.AppClassBean; import com.uiui.appstore.bean.AppInfo; import com.uiui.appstore.bean.Banner; import com.uiui.appstore.bean.BaseResponse; @@ -20,10 +21,10 @@ import com.uiui.appstore.gson.GsonUtils; import com.uiui.appstore.manager.ConnectManager; import com.uiui.appstore.manager.ConnectMode; import com.uiui.appstore.network.api.AdminApp; +import com.uiui.appstore.network.api.AdminAppClassApi; import com.uiui.appstore.network.api.BannerImage; import com.uiui.appstore.network.api.DownloadApp; import com.uiui.appstore.network.api.GetBanner; -import com.uiui.appstore.network.api.GetBatchApi; import com.uiui.appstore.network.api.NewestAppUpdate; import com.uiui.appstore.network.api.QueryAllApp; import com.uiui.appstore.network.api.QueryPackageApp; @@ -139,9 +140,10 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } - - public SNInfo getuserInfoControl() { - return mRetrofit.create(SNInfo.class); + public Observable>> getAdminAppObservable() { + return mRetrofit.create(AdminApp.class).getAdminApp() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getQueryAllAppObservable() { @@ -151,6 +153,17 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable>> getAdminAppClassObservable() { + return mRetrofit.create(AdminAppClassApi.class) + .getAdminAppClassApi() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public SNInfo getuserInfoControl() { + return mRetrofit.create(SNInfo.class); + } + public SearchApp getSearchAppControl() { return mRetrofit.create(SearchApp.class); } @@ -171,51 +184,11 @@ public class NetInterfaceManager { return mRetrofit.create(QueryPackageApp.class); } - public Observable>> getAdminAppObservable() { - return mRetrofit.create(AdminApp.class).getAdminApp() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - public Observable> getBatchApiControl() { - return mRetrofit.create(GetBatchApi.class) - .getBatch(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - public interface onCompleteCallback { void onComplete(); } - /** - * 设置推送标签 - * - * @param lifecycle - * @param callback - */ - public void setPushTags(boolean refresh, BehaviorSubject lifecycle, onCompleteCallback callback) { - ConnectMode connectMode = ConnectMode.SIX_HOUR; - if (refresh) { - connectMode = ConnectMode.ONE_HOUR; - } - if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_BATCH, connectMode)) { - setPushTags(lifecycle, callback); - } else { - String jsonString = cacheHelper.getAsString(UrlAddress.GET_BATCH); - //为 "" 是已经请求成功的 - if (jsonString == null) { - setPushTags(lifecycle, callback); - } else { - Set tagSets = mMMKV.decodeStringSet(UrlAddress.GET_BATCH); - Log.e("setPushTags", "tagSets: " + tagSets); - clearAndAppendTags(tagSets); - callback.onComplete(); - } - } - } - - public void setPushTags(BehaviorSubject lifecycle, onCompleteCallback callback) { + public void setPushTags(onCompleteCallback callback) { Set set = new HashSet(); JGYUtils.getInstance().getAppPlatform(platform -> { if (platform == JGYUtils.MTKPlatform) { @@ -228,47 +201,8 @@ public class NetInterfaceManager { set.add(JGYUtils.UMTK11Tag); } }); - getBatchApiControl() - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("setPushTags", "onSubscribe: "); - } - - @Override - public void onNext(@NonNull BaseResponse response) { - Log.e("setPushTags", "onNext: " + response); - if (response.code == 200) { - BatchID batchID = response.data; - String batch = batchID.getBatch_id(); - Log.e("setPushTags", "onNext: " + batch); - if (!TextUtils.isEmpty(batch)) { - set.add(batch); - } else { - Log.e("setPushTags", "onNext: " + "batch empty"); - } - cacheHelper.put(UrlAddress.GET_BATCH, GsonUtils.toJSONString(response.data)); - } else { - cacheHelper.put(UrlAddress.GET_BATCH, ""); - } - mMMKV.encode(UrlAddress.GET_BATCH, set); - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("setPushTags", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - Log.e("setPushTags", "onComplete: "); - Log.e("setPushTags", "tagSets: " + set); - clearAndAppendTags(set); - callback.onComplete(); - } - }); + clearAndAppendTags(set); + callback.onComplete(); } private void clearAndAppendTags(Set tagSets) { diff --git a/app/src/main/java/com/uiui/appstore/network/UrlAddress.java b/app/src/main/java/com/uiui/appstore/network/UrlAddress.java index 86104ee..a5dd3d4 100644 --- a/app/src/main/java/com/uiui/appstore/network/UrlAddress.java +++ b/app/src/main/java/com/uiui/appstore/network/UrlAddress.java @@ -1,40 +1,21 @@ package com.uiui.appstore.network; public class UrlAddress { - public final static String ROOT_URL = "https://led.zuoyepad.com/android/"; - - /*获取批次*/ - public static final String GET_BATCH = "sn/getBatch"; + final static String ROOT_URL = "https://led.zuoyepad.com/android/"; //获取所有应用 public final static String GET_ALL_APPINFO = "app/queryAllApp"; + //获取管理员应用分类 + public final static String GET_ADMIN_APP_CLASS = "app/getAdminAppClass"; //获取管理员所有应用 public final static String GET_ADMIN_APP = "getAdminApp"; //获取应用详情 public final static String GET_PACKAGE_APP = "app/queryPackageApp"; - //获取所有应用排行 - public final static String GET_ALL_RANK = "App/rankings"; - //搜索应用 - public final static String GET_APPSEARCHE = "App/appSearch"; //通过SN获取绑定信息 public final static String GET_INFO_FROMESN = "sn/getSnInfo"; - //app分类查询 - public final static String GET_SORT_APP = "App/sortApp"; - //发送app安装信息 - public final static String SET_APP_INSTALL_INFO = "App/appInstall"; - //发送app卸载信息 - public final static String SET_APP_UNINSTALL_INFO = "App/appUnload"; - //根据包名获取更新 - public final static String GET_APP_UPDATE = "Update/update"; //获取banner图 public final static String GET_BANNER_IMG = "app/getBrand"; public final static String GET_BANNER = "sn/getBanner"; - - //获取所有应用包名 - public final static String GET_ALL_PACKAGENAME = "App/allPackageSn"; - //获取应用分类 - public final static String GET_SUBClASSFY = "Application/getSubClassfy"; - public final static String SEND_DOWNLOADAPP = "app/downloadApp"; //根据包名获取更新 public final static String GET_NEWESTAPPUPDATE = "app/newestAppUpdate"; diff --git a/app/src/main/java/com/uiui/appstore/network/api/AdminAppClassApi.java b/app/src/main/java/com/uiui/appstore/network/api/AdminAppClassApi.java new file mode 100644 index 0000000..f81e47d --- /dev/null +++ b/app/src/main/java/com/uiui/appstore/network/api/AdminAppClassApi.java @@ -0,0 +1,15 @@ +package com.uiui.appstore.network.api; + +import com.uiui.appstore.bean.AppClassBean; +import com.uiui.appstore.bean.BaseResponse; +import com.uiui.appstore.network.UrlAddress; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; + +public interface AdminAppClassApi { + @GET(UrlAddress.GET_ADMIN_APP_CLASS) + Observable>> getAdminAppClassApi(); +} diff --git a/app/src/main/java/com/uiui/appstore/network/api/GetBatchApi.java b/app/src/main/java/com/uiui/appstore/network/api/GetBatchApi.java deleted file mode 100644 index c099831..0000000 --- a/app/src/main/java/com/uiui/appstore/network/api/GetBatchApi.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.uiui.appstore.network.api; - -import com.uiui.appstore.bean.BaseResponse; -import com.uiui.appstore.bean.BatchID; -import com.uiui.appstore.network.UrlAddress; - -import io.reactivex.rxjava3.core.Observable; -import retrofit2.http.GET; -import retrofit2.http.Query; - -public interface GetBatchApi { - @GET(UrlAddress.GET_BATCH) - Observable> getBatch( - @Query("sn") String sn - ); - -} diff --git a/app/src/main/java/com/uiui/appstore/service/main/MainSPresenter.java b/app/src/main/java/com/uiui/appstore/service/main/MainSPresenter.java index 6d2ce0e..1985013 100644 --- a/app/src/main/java/com/uiui/appstore/service/main/MainSPresenter.java +++ b/app/src/main/java/com/uiui/appstore/service/main/MainSPresenter.java @@ -39,7 +39,7 @@ public class MainSPresenter implements MainSContact.Presenter { @Override public void getSnTag() { - NetInterfaceManager.getInstance().setPushTags(true, getLifecycle(), new NetInterfaceManager.onCompleteCallback() { + NetInterfaceManager.getInstance().setPushTags(new NetInterfaceManager.onCompleteCallback() { @Override public void onComplete() { mView.setSnTag(); diff --git a/app/src/main/java/com/uiui/appstore/service/main/MainService.java b/app/src/main/java/com/uiui/appstore/service/main/MainService.java index 23f34cf..6bb2716 100644 --- a/app/src/main/java/com/uiui/appstore/service/main/MainService.java +++ b/app/src/main/java/com/uiui/appstore/service/main/MainService.java @@ -14,6 +14,7 @@ import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.RxLifecycleAndroid; import com.uiui.appstore.KeepAliveConnection; import com.uiui.appstore.network.HTTPInterface; +import com.uiui.appstore.utils.JGYUtils; import com.uiui.appstore.utils.SPUtils; import com.uiui.appstore.utils.ToastUtil; @@ -32,13 +33,10 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject; public class MainService extends Service implements MainSContact.MainView, NetworkUtils.OnNetworkStatusChangedListener, LifecycleProvider { private static final String TAG = MainService.class.getSimpleName(); - private final String DOWNLOAD_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + "uiui"; - public MainSPresenter mPresenter; private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); - @Override public void onDisconnected() { Log.e(TAG, "网络未连接"); @@ -49,6 +47,8 @@ public class MainService extends Service implements MainSContact.MainView, Netwo public void onConnected(NetworkUtils.NetworkType networkType) { Log.e(TAG, "网络已连接"); ToastUtil.show("网络已连接"); + HTTPInterface.checkUpdate(MainService.this); + HTTPInterface.checkUpdate(MainService.this, "com.uiui.sn"); mPresenter.getSnTag(); } @@ -83,7 +83,6 @@ public class MainService extends Service implements MainSContact.MainView, Netwo @Override public int onStartCommand(Intent intent, int flags, int startId) { - start.onstar(System.currentTimeMillis()); return START_STICKY; } @@ -96,10 +95,7 @@ public class MainService extends Service implements MainSContact.MainView, Netwo mPresenter.attachView(this); NetworkUtils.registerNetworkStatusChangedListener(this); - Observable.create(subscribe) - .throttleFirst(3, TimeUnit.HOURS) - .subscribe(timeObserver); - File file = new File(DOWNLOAD_PATH); + File file = new File(JGYUtils.getInstance().getDownLoadPath()); if (file.isFile() || !file.exists()) { file.delete(); file.mkdirs(); @@ -115,51 +111,6 @@ public class MainService extends Service implements MainSContact.MainView, Netwo mPresenter.detachView(); } - private interface Start { - void onstar(long time); - } - - private Start start; - - private final ObservableOnSubscribe subscribe = new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - start = new Start() { - @Override - public void onstar(long time) { - emitter.onNext(time); - } - }; - } - }; - - private Observer timeObserver = new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e("TimeObserver", "Disposable: "); - } - - @Override - public void onNext(Long aLong) { - Log.e("TimeObserver", "onNext: " + aLong); - int isLogined = (int) SPUtils.get(MainService.this, "isLogined", 2); - if (isLogined == 2) return; - HTTPInterface.checkUpdate(MainService.this); - HTTPInterface.checkUpdate(MainService.this, "com.uiui.sn"); -// HTTPInterface.checkUpdate(InitJpushServer.this, "com.uiui.os"); - } - - @Override - public void onError(Throwable e) { - Log.e("TimeObserver", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e("TimeObserver", "onComplete: "); - } - }; - @Override public void setSnTag() { diff --git a/app/src/main/java/com/uiui/appstore/tpush/MessageReceiver.java b/app/src/main/java/com/uiui/appstore/tpush/MessageReceiver.java index b9b7492..a148706 100644 --- a/app/src/main/java/com/uiui/appstore/tpush/MessageReceiver.java +++ b/app/src/main/java/com/uiui/appstore/tpush/MessageReceiver.java @@ -22,6 +22,7 @@ import com.tencent.android.tpush.XGPushTextMessage; import com.uiui.appstore.tpush.common.NotificationService; import com.uiui.appstore.tpush.po.XGNotification; import com.uiui.appstore.utils.FileUtils; +import com.uiui.appstore.utils.JGYUtils; import com.uiui.appstore.utils.ToastUtil; import java.io.File; @@ -337,7 +338,7 @@ public class MessageReceiver extends XGPushBaseReceiver { Aria.download(this).load(downloadEntity.getId()).cancel(true); } } - File file = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/apk"); + File file = new File(JGYUtils.getInstance().getDownLoadPath()); file.mkdirs(); FileUtils.ariaDownload(context, url, jsonObject); Aria.download(this).resumeAllTask(); diff --git a/app/src/main/java/com/uiui/appstore/utils/FileUtils.java b/app/src/main/java/com/uiui/appstore/utils/FileUtils.java index af4cea4..77f7a45 100644 --- a/app/src/main/java/com/uiui/appstore/utils/FileUtils.java +++ b/app/src/main/java/com/uiui/appstore/utils/FileUtils.java @@ -3,10 +3,9 @@ package com.uiui.appstore.utils; import android.content.Context; import android.util.Log; +import com.arialyy.aria.core.Aria; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.uiui.appstore.base.FilePath; -import com.arialyy.aria.core.Aria; import java.io.File; import java.io.FileInputStream; @@ -28,7 +27,7 @@ public class FileUtils { /** * 获取单个文件的MD5值 * - * @param file 文件 + * @param file 文件 * @return */ @@ -58,11 +57,11 @@ public class FileUtils { public static void ariaDownload(Context context, String url, JsonObject jsonObject) { String fileName = getFileNamefromURL(url); JsonElement jsonElement = jsonObject.get("MD5"); - if (jsonElement!=null){ + if (jsonElement != null) { String urlMD5 = jsonElement.getAsString(); Log.e("ariaDownload", "urlMD5=" + urlMD5); } - File file = new File(FilePath.FileDownloadPath + "/uiui/" + fileName); + File file = new File(JGYUtils.getInstance().getDownLoadPath()); if (file.exists() && !file.isDirectory()) { String filenameMD5 = getMD5fromFileName(url); @@ -75,16 +74,16 @@ public class FileUtils { } else { Aria.download(context) .load(url) //读取下载地址 - .setFilePath(FilePath.FileDownloadPath + "/uiui/" + fileName, true) + .setFilePath(JGYUtils.getInstance().getDownLoadPath() + fileName) + .ignoreFilePathOccupy() .setExtendField(jsonObject.toString()) .create(); //启动下载} -// SaveListUtils.addDownLoadList(app_package); -// } } } else { Aria.download(context) .load(url) //读取下载地址 - .setFilePath(FilePath.FileDownloadPath + "/uiui/" + fileName, true) + .setFilePath(JGYUtils.getInstance().getDownLoadPath() + fileName) + .ignoreFilePathOccupy() .setExtendField(jsonObject.toString()) .create(); //启动下载} } diff --git a/app/src/main/java/com/uiui/appstore/utils/JGYUtils.java b/app/src/main/java/com/uiui/appstore/utils/JGYUtils.java index a77834e..5f5c820 100644 --- a/app/src/main/java/com/uiui/appstore/utils/JGYUtils.java +++ b/app/src/main/java/com/uiui/appstore/utils/JGYUtils.java @@ -11,15 +11,19 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.BatteryManager; import android.os.Build; +import android.os.Environment; import android.os.PowerManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; +import androidx.core.content.ContextCompat; + import com.uiui.appstore.BuildConfig; import com.uiui.appstore.receiver.BootReceiver; +import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -63,6 +67,11 @@ public class JGYUtils { return sInstance; } + public String getDownLoadPath() { + String path = ContextCompat.getExternalFilesDirs(mContext, Environment.DIRECTORY_DOWNLOADS)[0].getAbsolutePath(); + return path + File.separator; + } + public static boolean isOfficialVersion() { String channelValue = JGYUtils.getInstance().getStringMetaData(); return "official".equals(channelValue); diff --git a/app/src/main/java/com/uiui/appstore/view/HorizontalItemDecoration.java b/app/src/main/java/com/uiui/appstore/view/HorizontalItemDecoration.java new file mode 100644 index 0000000..e612417 --- /dev/null +++ b/app/src/main/java/com/uiui/appstore/view/HorizontalItemDecoration.java @@ -0,0 +1,41 @@ +package com.uiui.appstore.view; + +import android.content.Context; +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 定义水平方向的距离 + */ +public class HorizontalItemDecoration extends RecyclerView.ItemDecoration { + private int space;//定义2个Item之间的距离 + + public HorizontalItemDecoration(int space, Context mContext) { + this.space = dip2px(space, mContext); + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); + int totalCount = parent.getAdapter().getItemCount(); + if (position == 0) {//第一个 + outRect.left = space; + outRect.right = space / 2; + } else if (position == totalCount - 1) {//最后一个 + outRect.left = space / 2; + outRect.right = space; + } else {//中间其它的 + outRect.left = space / 2; + outRect.right = space / 2; + } + } + + public int dip2px(float dpValue, Context context) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} + diff --git a/app/src/main/res/drawable-xhdpi/icon_0.png b/app/src/main/res/drawable-xhdpi/icon_0.png new file mode 100644 index 0000000..2367a27 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_0.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_1.png b/app/src/main/res/drawable-xhdpi/icon_1.png new file mode 100644 index 0000000..74087de Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_1.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_2.png b/app/src/main/res/drawable-xhdpi/icon_2.png new file mode 100644 index 0000000..25f3ec3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_2.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_3.png b/app/src/main/res/drawable-xhdpi/icon_3.png new file mode 100644 index 0000000..2c5b074 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_3.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_4.png b/app/src/main/res/drawable-xhdpi/icon_4.png new file mode 100644 index 0000000..cdadbb0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_4.png differ diff --git a/app/src/main/res/drawable-xhdpi/land_banner.png b/app/src/main/res/drawable-xhdpi/land_banner.png index 142ed41..1565eaf 100644 Binary files a/app/src/main/res/drawable-xhdpi/land_banner.png and b/app/src/main/res/drawable-xhdpi/land_banner.png differ diff --git a/app/src/main/res/drawable-xhdpi/port_banner.png b/app/src/main/res/drawable-xhdpi/port_banner.png index 71cc77f..242d9da 100644 Binary files a/app/src/main/res/drawable-xhdpi/port_banner.png and b/app/src/main/res/drawable-xhdpi/port_banner.png differ diff --git a/app/src/main/res/layout-land/activity_details.xml b/app/src/main/res/layout-land/activity_details.xml index 2b8dd09..0cdae59 100644 --- a/app/src/main/res/layout-land/activity_details.xml +++ b/app/src/main/res/layout-land/activity_details.xml @@ -1,52 +1,56 @@ - - + android:layout_height="@dimen/dp_32" + android:orientation="horizontal" + app:layout_constraintTop_toTopOf="parent"> + android:src="@drawable/ic_back" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:textStyle="bold" + app:layout_constraintStart_toEndOf="@+id/search_iv_back" /> + + android:overScrollMode="never" + app:layout_constraintBottom_toTopOf="@id/constraintLayout2" + app:layout_constraintTop_toBottomOf="@+id/linearLayout4"> @@ -132,15 +136,14 @@ android:layout_marginTop="15dp" android:layout_marginBottom="15dp" android:nestedScrollingEnabled="false" - android:background="@color/white" android:overScrollMode="never" /> + android:layout_marginRight="@dimen/dp_16" /> + android:layout_marginRight="@dimen/dp_16" /> @@ -208,8 +211,8 @@ android:id="@+id/detail_tv_update_time" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/dp_15" - android:layout_marginRight="@dimen/dp_15" + android:layout_marginLeft="@dimen/dp_16" + android:layout_marginRight="@dimen/dp_16" android:text="时间" android:visibility="gone" /> @@ -217,19 +220,19 @@ android:id="@+id/detail_tv_Developers" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/dp_15" - android:layout_marginRight="@dimen/dp_15" + android:layout_marginLeft="@dimen/dp_16" + android:layout_marginRight="@dimen/dp_16" android:text="开发者" android:visibility="gone" /> - + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent">