diff --git a/app/build.gradle b/app/build.gradle index 4b2f489..671087a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.uiui.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 56 - versionName "6.5" + versionCode 59 + versionName "6.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -127,6 +127,9 @@ android { } } } + manifestPlaceholders = [ + Baidu_AK: "ZauKWLbO0AfHSgR2j3unMkP0MwbBZHxO" + ] } release { @@ -151,6 +154,9 @@ android { } } } + manifestPlaceholders = [ + Baidu_AK: "ZauKWLbO0AfHSgR2j3unMkP0MwbBZHxO" + ] } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a44ff12..2522f2c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -125,6 +125,8 @@ android:name=".activity.PolicyActivity" android:screenOrientation="portrait" android:theme="@style/AppWhiteTheme" /> + + getPackageList() { + PackageManager pm = getPackageManager(); + List appSelectBeanList = new ArrayList<>(); + List applicationInfos = pm.getInstalledPackages(0); + for (PackageInfo packageInfo : applicationInfos) { + if (BuildConfig.APPLICATION_ID.equals(packageInfo.applicationInfo.packageName)) { + continue; + } + final boolean isSystem = (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + if (!listThirdParty || !isSystem) { + AppSelectBean appSelectBean = new AppSelectBean(packageInfo.applicationInfo.loadLabel(pm).toString(), packageInfo.applicationInfo.packageName, packageInfo.applicationInfo.loadIcon(pm)); + appSelectBeanList.add(appSelectBean); + } + } + return appSelectBeanList; + } +} diff --git a/app/src/main/java/com/uiui/aios/activity/contact/ContactActivity.java b/app/src/main/java/com/uiui/aios/activity/contact/ContactActivity.java index 5190a69..a1a6d2e 100644 --- a/app/src/main/java/com/uiui/aios/activity/contact/ContactActivity.java +++ b/app/src/main/java/com/uiui/aios/activity/contact/ContactActivity.java @@ -74,10 +74,11 @@ public class ContactActivity extends BaseActivity implements ContactContact.Cont @Override public void setContact(List contactList) { - if (contactList != null) { - mContactAdapter.setContactList(contactList); - tv_people.setText(contactList.size() + "人"); - } - + tv_people.setText(contactList.size() + "人"); + Contact contact = new Contact(); + contact.setName("拨号"); + contact.setMobile(ContactAdapter.DIALER_PACKAGE); + contactList.add(0, contact); + mContactAdapter.setContactList(contactList); } } diff --git a/app/src/main/java/com/uiui/aios/activity/contact/ContactPresenter.java b/app/src/main/java/com/uiui/aios/activity/contact/ContactPresenter.java index 61bc49c..22133be 100644 --- a/app/src/main/java/com/uiui/aios/activity/contact/ContactPresenter.java +++ b/app/src/main/java/com/uiui/aios/activity/contact/ContactPresenter.java @@ -3,12 +3,19 @@ package com.uiui.aios.activity.contact; import android.content.Context; import android.util.Log; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.bean.Contact; import com.uiui.aios.network.NetInterfaceManager; +import com.uiui.aios.network.URLAddress; +import com.uiui.aios.utils.GsonUtils; +import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; import io.reactivex.rxjava3.annotations.NonNull; @@ -19,6 +26,7 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject; public class ContactPresenter implements ContactContact.Presenter { private Context mContext; private ContactContact.ContactView mView; + private MMKV mMMKV = MMKV.defaultMMKV(); private BehaviorSubject lifecycle; @@ -58,12 +66,28 @@ public class ContactPresenter implements ContactContact.Presenter { @Override public void onNext(@NonNull BaseResponse> listBaseResponse) { Log.e("getContactList", "onNext: " + listBaseResponse); - mView.setContact(listBaseResponse.data); + if (listBaseResponse.code == 200) { + mMMKV.putString(URLAddress.GET_MAIL_LIST, GsonUtils.toJsonString(listBaseResponse.data)); + mView.setContact(listBaseResponse.data); + } else { + mMMKV.putString(URLAddress.GET_MAIL_LIST, ""); + mView.setContact(new ArrayList<>()); + } } @Override public void onError(@NonNull Throwable e) { Log.e("getContactList", "onError: " + e.getMessage()); + String jsonString = mMMKV.getString(URLAddress.GET_MAIL_LIST, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List contacts = gson.fromJson(jsonString, type); + if (contacts == null) { + mView.setContact(new ArrayList<>()); + } else { + mView.setContact(contacts); + } onComplete(); } diff --git a/app/src/main/java/com/uiui/aios/adapter/AppSelectedAdapter.java b/app/src/main/java/com/uiui/aios/adapter/AppSelectedAdapter.java new file mode 100644 index 0000000..0e5d710 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/adapter/AppSelectedAdapter.java @@ -0,0 +1,87 @@ +package com.uiui.aios.adapter; + +import android.content.Context; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.tencent.mmkv.MMKV; +import com.uiui.aios.R; +import com.uiui.aios.activity.QuickAppActivity; +import com.uiui.aios.bean.AppSelectBean; + +import java.util.List; + +public class AppSelectedAdapter extends RecyclerView.Adapter { + private static final String TAG = AppSelectedAdapter.class.getSimpleName(); + private Context mContext; + private List mAppSelectBeans; + private int unselectedStatus = -1; + private int selecedPosition = unselectedStatus; + private MMKV mMMKV = MMKV.defaultMMKV(); + + public void setAppSelectBeans(List appSelectBeanList) { + this.mAppSelectBeans = appSelectBeanList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_app_select, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + AppSelectBean appSelectBean = mAppSelectBeans.get(position); + holder.iv_icon.setImageDrawable(appSelectBean.getIcon()); + holder.tv_name.setText(appSelectBean.getAppName()); + if (selecedPosition == position) { + holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_selected)); + } else { + holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_unselected)); + } + holder.iv_select.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (position != selecedPosition) { + holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_selected)); + selecedPosition = position; + mMMKV.encode(QuickAppActivity.QUICK_APP_KEY, appSelectBean.getPackageName()); + Log.e(TAG, "setQuickApp: " + appSelectBean.getPackageName()); + + } else { + holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_unselected)); + selecedPosition = -1; + mMMKV.encode(QuickAppActivity.QUICK_APP_KEY, ""); + Log.e(TAG, "setQuickApp: empty"); + } + notifyDataSetChanged(); + } + }); + } + + @Override + public int getItemCount() { + return mAppSelectBeans == null ? 0 : mAppSelectBeans.size(); + } + + static class Holder extends RecyclerView.ViewHolder { + ImageView iv_select, iv_icon; + TextView tv_name; + + Holder(@NonNull View itemView) { + super(itemView); + iv_select = itemView.findViewById(R.id.iv_select); + iv_icon = itemView.findViewById(R.id.iv_icon); + tv_name = itemView.findViewById(R.id.tv_name); + } + } +} diff --git a/app/src/main/java/com/uiui/aios/adapter/ContactAdapter.java b/app/src/main/java/com/uiui/aios/adapter/ContactAdapter.java index b8d80dc..0a54666 100644 --- a/app/src/main/java/com/uiui/aios/adapter/ContactAdapter.java +++ b/app/src/main/java/com/uiui/aios/adapter/ContactAdapter.java @@ -25,6 +25,8 @@ public class ContactAdapter extends RecyclerView.Adapter mContactList; private Context mContext; + public static final String DIALER_PACKAGE = "com.android.dialer"; + public void setContactList(List contactList) { this.mContactList = contactList; notifyDataSetChanged(); @@ -45,7 +47,9 @@ public class ContactAdapter extends RecyclerView.Adapter contactList) { - if (contactList == null || contactList.size() == 0) { - showNoData("温馨提示", "请在小程序上设置通讯录"); - } else { - startActivity(new Intent(getActivity(), ContactActivity.class)); - } +// if (contactList == null || contactList.size() == 0) { +// showNoData("温馨提示", "请在小程序上设置通讯录"); +// } else { +// startActivity(new Intent(mContext, ContactActivity.class)); +// } } @Override @@ -510,12 +534,12 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom @Override public void setEmpty() { - showNoData("温馨提示", "请在小程序上设置通讯录"); +// showNoData("温馨提示", "请在小程序上设置通讯录"); } @Override public void onComplete() { - + startActivity(new Intent(mContext, ContactActivity.class)); } }); } @@ -591,9 +615,29 @@ public class CustomFragment extends BaseFragment implements CustomContact.Custom // setAlarm(); getAlarmClock(); setSosNumber(); + setQuickApp(); mCustomPresenter.getSnIsActivation(); } + private String quickAppPackagesName; + + private void setQuickApp() { + quickAppPackagesName = mMMKV.decodeString(QuickAppActivity.QUICK_APP_KEY, ""); + Log.e(TAG, "setQuickApp: " + quickAppPackagesName); + if (!TextUtils.isEmpty(quickAppPackagesName)) { + ApplicationInfo applicationInfo = null; + PackageManager pm = mContext.getPackageManager(); + try { + applicationInfo = pm.getApplicationInfo(quickAppPackagesName, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (applicationInfo != null) { + iv_app.setImageDrawable(applicationInfo.loadIcon(pm)); + } + } + } + private void openScheme(String uri) { int is_health = mMMKV.decodeInt("is_health", 0); if (is_health == 0) { diff --git a/app/src/main/java/com/uiui/aios/network/interceptor/RepeatRequestInterceptor.java b/app/src/main/java/com/uiui/aios/network/interceptor/RepeatRequestInterceptor.java index 83d8973..3da88e4 100644 --- a/app/src/main/java/com/uiui/aios/network/interceptor/RepeatRequestInterceptor.java +++ b/app/src/main/java/com/uiui/aios/network/interceptor/RepeatRequestInterceptor.java @@ -13,9 +13,14 @@ import java.util.concurrent.ConcurrentHashMap; import okhttp3.Interceptor; import okhttp3.Protocol; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; +import okhttp3.ResponseBody; import okio.Buffer; +/** + * v1.0 2022-07-15 16:16:52 + */ public class RepeatRequestInterceptor implements Interceptor { private static final String TAG = RepeatRequestInterceptor.class.getSimpleName(); @@ -26,13 +31,18 @@ public class RepeatRequestInterceptor implements Interceptor { @Override public Response intercept(@NotNull Chain chain) throws IOException { Request request = chain.request(); + Response response = chain.proceed(request); + ResponseBody responseBody = response.body(); - Response response = chain.proceed(chain.request()); - String content = response.body().string(); - if (BuildConfig.DEBUG) - Log.e(TAG, "请求体返回:| Response:" + content); + //会消费请求,导致请求多次 + String content = responseBody.string(); +// Response copy = response.newBuilder().body(responseBody).build(); + ResponseBody copy = ResponseBody.create(responseBody.contentType(), content); + if (BuildConfig.DEBUG) { +// Log.e(TAG, "请求体返回:| Response: " + request.url().encodedPath() + "\t body: " + content); + } //相同的请求 - String requestKey = MD5Util.getUpperMD5Str(request.method() + request.url().toString() + request.body()); + String requestKey = MD5Util.getUpperMD5Str(request.method() + request.url().toString() + requestBodyToString(request.body())); long time = System.currentTimeMillis();//请求时间 try { if (requestIdsMap.size() > 0 && requestIdsMap.containsKey(requestKey)) { @@ -48,7 +58,7 @@ public class RepeatRequestInterceptor implements Interceptor { log("注册请求:", requestKey, request); // RepeatRequestInterceptor.Builder builder = request.newBuilder(); // builder.addHeader("header", jsonObject.toString()); - return chain.proceed(request); + return response.newBuilder().body(copy).build(); } catch (IOException e) { Log.e(TAG, "intercept: " + e.getMessage()); throw e; @@ -78,8 +88,20 @@ public class RepeatRequestInterceptor implements Interceptor { } return buffer.readUtf8(); } catch (Exception e) { - return "-" + e.getMessage(); + return "-"; } } + private static String requestBodyToString(RequestBody body) { + try { + final Buffer buffer = new Buffer(); + body.writeTo(buffer); + if (buffer.size() > 4096) { + return "-too long"; + } + return buffer.readUtf8(); + } catch (Exception e) { + return "-"; + } + } } diff --git a/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java b/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java index 4f2433d..f14d454 100644 --- a/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java +++ b/app/src/main/java/com/uiui/aios/service/main/MainSPresenter.java @@ -65,12 +65,12 @@ public class MainSPresenter implements MainSContact.Presenter { @Override public void setAlarmClockEmpty() { - Log.e(TAG, "setAlarmClock: "); + Log.e(TAG, "setAlarmClock: setAlarmClockEmpty"); } @Override public void onError() { - Log.e(TAG, "setAlarmClock: "); + Log.e(TAG, "setAlarmClock: onError"); } }); diff --git a/app/src/main/java/com/uiui/aios/utils/SystemUtils.java b/app/src/main/java/com/uiui/aios/utils/SystemUtils.java new file mode 100644 index 0000000..6fba55b --- /dev/null +++ b/app/src/main/java/com/uiui/aios/utils/SystemUtils.java @@ -0,0 +1,24 @@ +package com.uiui.aios.utils; + +import android.app.ActivityManager; +import android.content.Context; + +import java.util.List; + +public class SystemUtils { + + public static boolean isMainProcessName(Context cxt, int pid) { + String packageName = cxt.getPackageName(); + ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE); + List runningApps = am.getRunningAppProcesses(); + if (runningApps == null) { + return false; + } + for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) { + if (procInfo.pid == pid) { + return procInfo.processName.equals(packageName); + } + } + return false; + } +} diff --git a/app/src/main/java/com/uiui/aios/view/GridSpaceItemDecoration.java b/app/src/main/java/com/uiui/aios/view/GridSpaceItemDecoration.java new file mode 100644 index 0000000..aa1c293 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/view/GridSpaceItemDecoration.java @@ -0,0 +1,59 @@ +package com.uiui.aios.view; + +import android.graphics.Rect; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +/** + * 描述 : RecyclerView GridLayoutManager 等间距。 + *

+ * 等间距需满足两个条件: + * 1.各个模块的大小相等,即 各列的left+right 值相等; + * 2.各列的间距相等,即 前列的right + 后列的left = 列间距; + *

+ * 在{@link #getItemOffsets(Rect, View, RecyclerView, RecyclerView.State)} 中针对 outRect 的left 和right 满足这两个条件即可 + *

+ * 作者 : shiguotao + * 版本 : V1 + * 创建时间 : 2020/3/19 4:54 PM + */ +public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration { + + private final String TAG = "GridSpaceItemDecoration"; + + private int mSpanCount;//横条目数量 + private int mRowSpacing;//行间距 + private int mColumnSpacing;// 列间距 + + /** + * @param spanCount 列数 + * @param rowSpacing 行间距 + * @param columnSpacing 列间距 + */ + public GridSpaceItemDecoration(int spanCount, int rowSpacing, int columnSpacing) { + this.mSpanCount = spanCount; + this.mRowSpacing = rowSpacing; + this.mColumnSpacing = columnSpacing; + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); // 获取view 在adapter中的位置。 + int column = position % mSpanCount; // view 所在的列 + + outRect.left = column * mColumnSpacing / mSpanCount; // column * (列间距 * (1f / 列数)) + outRect.right = mColumnSpacing - (column + 1) * mColumnSpacing / mSpanCount; // 列间距 - (column + 1) * (列间距 * (1f /列数)) + + Log.e(TAG, "position:" + position + + " columnIndex: " + column + + " left,right ->" + outRect.left + "," + outRect.right); + + // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=mRowSpacing + if (position >= mSpanCount) { + outRect.top = mRowSpacing; // item top + } + } +} diff --git a/app/src/main/res/drawable-hdpi/dialer_icon.png b/app/src/main/res/drawable-hdpi/dialer_icon.png new file mode 100644 index 0000000..fcb8c3a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/dialer_icon.png differ diff --git a/app/src/main/res/drawable-hdpi/home_quick_app.png b/app/src/main/res/drawable-hdpi/home_quick_app.png new file mode 100644 index 0000000..c8e5439 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_quick_app.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_selected.png b/app/src/main/res/drawable-hdpi/icon_selected.png new file mode 100644 index 0000000..d9560f2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_selected.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_unselected.png b/app/src/main/res/drawable-hdpi/icon_unselected.png new file mode 100644 index 0000000..d21c906 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_unselected.png differ diff --git a/app/src/main/res/drawable-hdpi/more.png b/app/src/main/res/drawable-hdpi/more.png new file mode 100644 index 0000000..b5fb61b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/more.png differ diff --git a/app/src/main/res/drawable/app_select_background.xml b/app/src/main/res/drawable/app_select_background.xml new file mode 100644 index 0000000..d4c331c --- /dev/null +++ b/app/src/main/res/drawable/app_select_background.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index 978951d..362976e 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -102,8 +102,8 @@ android:layout_marginEnd="@dimen/dp_4" android:layout_marginBottom="@dimen/dp_2" android:layout_weight="3" - android:visibility="gone" - android:background="@drawable/custom_bg_weather"> + android:background="@drawable/custom_bg_weather" + android:visibility="gone"> + + + + + + + + + + + + android:background="@drawable/custom_bg_health" + android:visibility="gone"> + + + + + + + + + + + + + android:background="@drawable/custom_bg_health" + android:visibility="gone"> diff --git a/app/src/main/res/layout/activity_quick_app.xml b/app/src/main/res/layout/activity_quick_app.xml new file mode 100644 index 0000000..e4b5113 --- /dev/null +++ b/app/src/main/res/layout/activity_quick_app.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_privacy_policy.xml b/app/src/main/res/layout/dialog_privacy_policy.xml index a9b68ad..b262df4 100644 --- a/app/src/main/res/layout/dialog_privacy_policy.xml +++ b/app/src/main/res/layout/dialog_privacy_policy.xml @@ -1,13 +1,12 @@ - + app:layout_constraintTop_toBottomOf="@+id/textView6"> + + + + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 100d2b3..9dfe5a8 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -28,5 +28,6 @@ #2c77ba #f4bea3 + #858585