liuzhenxing1118 5 tháng trước cách đây
mục cha
commit
808bd47682

+ 5 - 1
app/build.gradle

@@ -45,10 +45,14 @@ if(SDK_DIR == null) {
 }
 }
 
 
 dependencies {
 dependencies {
-    implementation 'androidx.appcompat:appcompat:1.4.1'
     implementation 'com.google.android.material:material:1.6.0'
     implementation 'com.google.android.material:material:1.6.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
     implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
     testImplementation 'junit:junit:4.13.2'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+
+    compileOnly(files("${SDK_DIR}/platforms/android-24/data/layoutlib.jar"))
+    implementation(fileTree("libs"))
+    implementation 'com.makeramen:roundedimageview:2.3.0'
+    implementation 'com.google.code.gson:gson:2.8.0'
 }
 }

+ 7 - 0
app/src/main/AndroidManifest.xml

@@ -18,6 +18,13 @@
             android:exported="true"
             android:exported="true"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:launchMode="singleInstance">
             android:launchMode="singleInstance">
+        </activity>
+
+        <activity
+            android:name=".activity.RecentActivity"
+            android:exported="true"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:launchMode="singleInstance">
             <intent-filter>
             <intent-filter>
                 <action android:name="action.xplora.chat"/>
                 <action android:name="action.xplora.chat"/>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.MAIN" />

+ 76 - 0
app/src/main/java/com/sikey/skcontact/activity/RecentActivity.java

@@ -0,0 +1,76 @@
+package com.sikey.skcontact.activity;
+
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ListView;
+
+import com.sikey.skcontact.R;
+import com.sikey.skcontact.adapter.BaseListAdapter;
+import com.sikey.skcontact.manager.DataManager;
+import com.sikey.skcontact.manager.DatabaseUtils;
+import com.sikey.skcontact.model.BaseModel;
+import com.sikey.skcontact.model.ContactBean;
+import com.sikey.skcontact.model.RecentBean;
+import com.sikey.skcontact.utils.Constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RecentActivity extends BaseActivity {
+    public final String TAG = "losion / skcontact :" + getClass().getSimpleName();
+    public static List<RecentBean> mRecentBeanList = new ArrayList<>();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.d(TAG, "onCreate: ");
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_list_title);
+        queryRecent(0);
+        initData();
+        initView();
+    }
+
+    public void queryRecent(int offset) {
+        ArrayList<ContactBean> contacts = DatabaseUtils.queryContacts(this);
+        List<RecentBean> arrayList = DatabaseUtils.queryRecent(this, offset);
+        if (offset == 0) {
+            mRecentBeanList.clear();
+        }
+
+        for (RecentBean recentBean : arrayList) {
+            ContactBean contactBean = DataManager.searchContact(recentBean, contacts);
+            if (contactBean != null) {
+                recentBean.contactBean = contactBean;
+                mRecentBeanList.add(recentBean);
+            }
+        }
+    }
+
+    private void initData() {
+        for (int i = 0; i < mRecentBeanList.size(); i++) {
+            BaseModel model = new BaseModel();
+            model.title = mRecentBeanList.get(i).caller.trim();
+            model.cellType = Constant.CellType.TITLE;
+            model.isShowArrow = false;
+            mDataList.add(model);
+        }
+    }
+
+    private void initView() {
+        mAdapter = new BaseListAdapter(this, 0, mDataList);
+        ListView listView = findViewById(R.id.activity_listview);
+        listView.setAdapter(mAdapter);
+        listView.setDivider(new ColorDrawable(Color.TRANSPARENT));
+        listView.setDividerHeight(0);
+        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+
+            }
+        });
+    }
+}

+ 32 - 5
app/src/main/java/com/sikey/skcontact/manager/DataManager.java

@@ -2,14 +2,41 @@ package com.sikey.skcontact.manager;
 
 
 import android.content.Context;
 import android.content.Context;
 import android.provider.Settings;
 import android.provider.Settings;
+import android.util.Log;
+
+import com.sikey.skcontact.model.ContactBean;
+import com.sikey.skcontact.model.RecentBean;
+import com.sikey.skcontact.utils.ToolsUtils;
+
+import java.util.ArrayList;
 
 
 public class DataManager {
 public class DataManager {
 
 
-    public static String getVideoUserId(Context context) {
-        return Settings.Global.getString(context.getContentResolver(), "sk_tk");
-    }
+    public static ContactBean searchContact(RecentBean recentBean, ArrayList<ContactBean> contactBeanList) {
+        int minLength = 5;
+        for (ContactBean contactBean : contactBeanList) {
+            //如果都大于minLength
+            String recentNumber = "";
+            String contactNumber = "";
+            if (recentBean.caller.length() >= minLength && contactBean.phoneNumber.length() >= minLength) {
+                recentNumber = ToolsUtils.phoneNumberSubString(recentBean.caller, minLength);
+                contactNumber = ToolsUtils.phoneNumberSubString(contactBean.phoneNumber, minLength);
+            } else {
+                recentNumber = recentBean.caller;
+
+                if (ToolsUtils.isUrgencyNumber(contactBean.phoneNumber)) {
+                    contactNumber = contactBean.phoneNumber;
+                } else {
+                    contactNumber = ToolsUtils.getCallNumber(contactBean.countryPN, contactBean.phoneNumber);
+                }
+                recentNumber = recentNumber.replace("+", "");
+                contactNumber = contactNumber.replace("+", "");
+            }
 
 
-    public static void setVideoUserId(Context context, String value) {
-        Settings.Global.putString(context.getContentResolver(), "sk_tk", value);
+            if (recentNumber.equals(contactNumber)) {
+                return contactBean;
+            }
+        }
+        return null;
     }
     }
 }
 }

+ 51 - 0
app/src/main/java/com/sikey/skcontact/manager/DatabaseUtils.java

@@ -5,15 +5,18 @@ import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.Cursor;
 import android.net.Uri;
 import android.net.Uri;
+import android.provider.CallLog;
 import android.util.Log;
 import android.util.Log;
 
 
 import com.sikey.skcontact.ContactApplication;
 import com.sikey.skcontact.ContactApplication;
 import com.sikey.skcontact.model.ContactBean;
 import com.sikey.skcontact.model.ContactBean;
+import com.sikey.skcontact.model.RecentBean;
 import com.sikey.skcontact.utils.Macros;
 import com.sikey.skcontact.utils.Macros;
 import com.sikey.skcontact.utils.MetaData;
 import com.sikey.skcontact.utils.MetaData;
 import com.sikey.skcontact.utils.ToolsUtils;
 import com.sikey.skcontact.utils.ToolsUtils;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.List;
 
 
 public class DatabaseUtils {
 public class DatabaseUtils {
     public static String TAG = "losion / skcontact :" + "DatabaseUtils";
     public static String TAG = "losion / skcontact :" + "DatabaseUtils";
@@ -57,6 +60,42 @@ public class DatabaseUtils {
         }
         }
     }
     }
 
 
+    @SuppressLint("Range")
+    public static ArrayList<RecentBean> queryRecent(Context context, int offset) {
+        if (Macros.DEBUG) {
+            return testRecentList();
+        } else {
+            StringBuilder sortOrder = new StringBuilder();
+            sortOrder.append(CallLog.Calls.DATE).append(" desc ").append(" limit ").append(20).append(" Offset ").append(offset);
+
+            ArrayList<RecentBean> arrayList = new ArrayList<>();
+            ContentResolver resolver = context.getContentResolver();
+            Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null, null, null, sortOrder.toString());
+            if (cursor == null) {
+                Log.d(TAG, "queryRecent: cursor == null");
+                return arrayList;
+            }
+            if (!cursor.moveToFirst()) {
+                Log.d(TAG, "queryRecent: cursor.moveToFirst false");
+                cursor.close();
+                return arrayList;
+            }
+            Log.d(TAG, "queryRecent: db ok");
+            do {
+                RecentBean bean = new RecentBean();
+                bean._id = cursor.getInt(cursor.getColumnIndex("_id"));
+                bean.type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));//通话类型,1 来电 .INCOMING_TYPE;2 已拨 .OUTGOING_;3 未接 .MISSED_
+                bean.caller = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
+                bean.start = (int)(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)) / 1000);
+                bean.duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));
+                arrayList.add(bean);
+            } while (cursor.moveToNext());
+            cursor.close();
+            Log.d(TAG, "queryRecent: " + arrayList.size());
+            return arrayList;
+        }
+    }
+
     public static ArrayList<ContactBean> testContactList() {
     public static ArrayList<ContactBean> testContactList() {
         ArrayList<ContactBean> arrayList = new ArrayList<>();
         ArrayList<ContactBean> arrayList = new ArrayList<>();
         for (int i = 0; i < 8; i++) {
         for (int i = 0; i < 8; i++) {
@@ -68,4 +107,16 @@ public class DatabaseUtils {
         }
         }
         return arrayList;
         return arrayList;
     }
     }
+
+    public static ArrayList<RecentBean> testRecentList() {
+        ArrayList<RecentBean> recentList = new ArrayList<>();
+        for (int i = 0; i < 20; i++) {
+            RecentBean model = new RecentBean();
+            model.caller = "1111";
+            model.type = i;
+            model.start = 1669310077; //ToolsUtils.getCurrentTimeSecond(); //1467442671;
+            recentList.add(model);
+        }
+        return recentList;
+    }
 }
 }

+ 21 - 0
app/src/main/java/com/sikey/skcontact/model/RecentBean.java

@@ -0,0 +1,21 @@
+package com.sikey.skcontact.model;
+
+public class RecentBean extends BaseModel {
+    public long _id = 0;
+    public String caller = "";
+    public int start = 0;
+    public int duration = 0;
+
+    //- 1 : Receive success
+    //- 2 : Outgoing success
+    //- 20 : Deny call(Income)
+    //- 21 : income fail, didn't answer
+    //- 40 : Failed to receive due to other reasons
+    //- 41 : income fail, unknown caller
+    //- 42 : income fail, not in contact
+    //- 50 : The other party rejects the call (outgoing)
+    //- 80 : Failed to outgoing due to other reasons (outgoing)
+    public int type = 0;
+
+    public ContactBean contactBean = null;
+}

+ 63 - 0
app/src/main/java/com/sikey/skcontact/utils/ToolsUtils.java

@@ -5,12 +5,18 @@ import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.BitmapFactory;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo;
+import android.util.Log;
 import android.widget.ImageView;
 import android.widget.ImageView;
 
 
+import com.android.i18n.phonenumbers.PhoneNumberUtil;
+import com.android.i18n.phonenumbers.Phonenumber;
+import com.android.internal.telephony.ITelephony;
+
 import java.io.FileInputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 
 
 public class ToolsUtils {
 public class ToolsUtils {
+    public static String TAG = "losion / skcontact :" + "ToolsUtils";
 
 
     public static int dip2px(Context context, float dpValue) {
     public static int dip2px(Context context, float dpValue) {
         float scale = context.getResources().getDisplayMetrics().density;
         float scale = context.getResources().getDisplayMetrics().density;
@@ -59,4 +65,61 @@ public class ToolsUtils {
         NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
         NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
         return networkInfo != null && networkInfo.isAvailable();
         return networkInfo != null && networkInfo.isAvailable();
     }
     }
+
+    public static String phoneNumberSubString(String content, int endCount) {
+        if (content.length() < endCount)
+            return content;
+        return content.substring(content.length() - endCount);
+    }
+
+    public static boolean isUrgencyNumber(String value) {
+        String[] urgencyNumbers = android.os.SystemProperties.get("ril.ecclist").split(",");
+        for (String v : urgencyNumbers) {
+            if (v.equals(value))
+                return true;
+        }
+        return false;
+    }
+
+    public static String getCallNumber(String countryCode, String number) {
+        if (Macros.DEBUG) {
+            return countryCode + number;
+        }
+
+        countryCode = countryCode.replace("+", "");
+        number = number.replace("+", "");
+
+        String national = number;
+        String extension = "";
+        if (number.contains(",")) {
+            int index = number.indexOf(",");
+            national = number.substring(0,index);
+            extension = number.substring(index+1);
+        }
+        if (number.contains(";")) {
+            int index = number.indexOf(";");
+            national = number.substring(0,index);
+            extension = number.substring(index+1);
+        }
+        Log.d(TAG, "getCallNumber: national:" + national + " extension:" + extension);
+
+        Phonenumber.PhoneNumber phoneNumber = new Phonenumber.PhoneNumber();
+        if (!national.equals("")) {
+            //TODO:需要屏蔽下非法字符
+            phoneNumber.setNationalNumber(Long.parseLong(national));
+            if (extension.length() > 0) {
+                phoneNumber.setExtension(extension);
+            }
+        }
+        if (!countryCode.equals("")) {
+            phoneNumber.setCountryCode(Integer.parseInt(countryCode));
+        }
+
+        PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
+        String ret = phoneNumberUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
+        if (extension.length() > 0) {
+            ret = ret + "," + extension;
+        }
+        return ret;
+    }
 }
 }