liuzhenxing1118 5 місяців тому
батько
коміт
fc7a960f0a

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

@@ -4,6 +4,8 @@
     package="com.sikey.skcontact">
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
@@ -18,6 +20,17 @@
             android:exported="true"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:launchMode="singleInstance">
+            <intent-filter>
+                <action android:name="action.xplora.chat"/>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+            <meta-data
+                android:name="android.app.icon"
+                android:resource="@drawable/app_contact" />
+            <meta-data
+                android:name="android.app.label"
+                android:resource="@string/app_contact" />
         </activity>
 
         <activity
@@ -30,6 +43,12 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
+            <meta-data
+                android:name="android.app.icon"
+                android:resource="@drawable/app_recent" />
+            <meta-data
+                android:name="android.app.label"
+                android:resource="@string/app_recent" />
         </activity>
 
         <activity
@@ -37,6 +56,23 @@
             android:exported="true"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:launchMode="singleInstance">
+            <intent-filter>
+                <action android:name="action.xplora.chat"/>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+            <meta-data
+                android:name="android.app.icon"
+                android:resource="@drawable/app_dial" />
+            <meta-data
+                android:name="android.app.label"
+                android:resource="@string/app_dial" />
+        </activity>
+        <activity
+            android:name=".activity.CallActivity"
+            android:exported="true"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            android:launchMode="singleInstance">
         </activity>
 
     </application>

+ 20 - 0
app/src/main/java/com/sikey/skcontact/ContactApplication.java

@@ -1,6 +1,11 @@
 package com.sikey.skcontact;
 
+import android.Manifest;
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.telephony.TelephonyManager;
+
+import androidx.core.app.ActivityCompat;
 
 public class ContactApplication extends android.app.Application {
     private static Context sContext;
@@ -14,4 +19,19 @@ public class ContactApplication extends android.app.Application {
     public static Context getsContext() {
         return sContext;
     }
+
+    public static boolean isInterruptCalling(Context context) {
+        TelephonyManager tm = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE);//取得相关系统服务
+        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
+            // TODO: Consider calling
+            //    ActivityCompat#requestPermissions
+            // here to request the missing permissions, and then overriding
+            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
+            //                                          int[] grantResults)
+            // to handle the case where the user grants the permission. See the documentation
+            // for ActivityCompat#requestPermissions for more details.
+            return true;
+        }
+        return tm.getSimState() != TelephonyManager.SIM_STATE_READY || tm.getVoiceNetworkType() == TelephonyManager.NETWORK_TYPE_UNKNOWN;
+    }
 }

+ 45 - 0
app/src/main/java/com/sikey/skcontact/activity/BaseCallActivity.java

@@ -0,0 +1,45 @@
+package com.sikey.skcontact.activity;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.util.Log;
+
+import com.sikey.skcontact.ContactApplication;
+import com.sikey.skcontact.R;
+import com.sikey.skcontact.utils.Constant;
+import com.sikey.skcontact.utils.ToolsUtils;
+
+public class BaseCallActivity extends BaseActivity {
+
+    public void showCall(String name, String code, String phoneNumber, String callNumber, int isSupportVideo) {
+        Intent intent = new Intent(this, CallActivity.class);
+        intent.putExtra(Constant.INTENT_NAME, name);
+        intent.putExtra(Constant.INTENT_CODE, code);
+        intent.putExtra(Constant.INTENT_PHONENUMBER, phoneNumber);
+        intent.putExtra(Constant.INTENT_CALLNUMBER, callNumber);
+        intent.putExtra(Constant.INTENT_VIDEO, isSupportVideo);
+        startActivity(intent);
+    }
+
+    public void callAction(String countryCode, String phoneNumber, String callNumber) {
+        Log.d(TAG, "onRecentContactClick: " + " countryCode:" + countryCode + "  phoneNumber:" + phoneNumber + "  callNumber:" + callNumber );
+        //判断是否为紧急号码
+        if (ToolsUtils.isUrgencyNumber(phoneNumber)) {
+            callNumber = phoneNumber;
+        } else {
+            //判断是否有sim卡,eSIM、有网络等
+            boolean isFailed = ContactApplication.isInterruptCalling(this);
+            if (isFailed) {
+                toast(getString(R.string.calling_interrupt));
+                return;
+            }
+            if (callNumber.isEmpty()) {
+                callNumber = ToolsUtils.getCallNumber(countryCode, phoneNumber);
+            }
+        }
+        Log.d(TAG, "call: callNumber : " + callNumber);
+        Intent intent = new Intent("android.intent.action.CALL_PRIVILEGED", Uri.parse("tel:" + callNumber));
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+    }
+}

+ 6 - 5
app/src/main/java/com/sikey/skcontact/activity/BaseInputActivity.java

@@ -7,13 +7,14 @@ import android.widget.ImageButton;
 import android.widget.TextView;
 
 import com.sikey.skcontact.R;
-import com.sikey.skcontact.activity.BaseActivity;
+import com.sikey.skcontact.activity.BaseCallActivity;
 
-public class BaseInputActivity extends BaseActivity {
+public class BaseInputActivity extends BaseCallActivity {
     public String mInput = "";
     private TextView mTextView = null;
+    private int mInputMax = 32;
 
-    protected void onSureClick() {};
+    protected void onSureClick(String value) {};
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -60,10 +61,10 @@ public class BaseInputActivity extends BaseActivity {
                 actionBack();
             } else if (tag == 101) {
                 if (mInput.length() > 0) {
-                    onSureClick();
+                    onSureClick(mInput);
                 }
             } else {
-                if (mInput.length() >= 4)
+                if (mInput.length() >= mInputMax)
                     return;
                 mInput += tag;
                 showInputCode();

+ 55 - 0
app/src/main/java/com/sikey/skcontact/activity/CallActivity.java

@@ -0,0 +1,55 @@
+package com.sikey.skcontact.activity;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.sikey.skcontact.R;
+import com.sikey.skcontact.utils.Constant;
+
+public class CallActivity extends BaseCallActivity {
+    private String mName = "";
+    private String mCode = "";
+    private String mPhoneNumber = "";
+    private String mCallNumber = "";
+    private int isSupportVideo = 0;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_call);
+        initData();
+        initView();
+    }
+
+    private void initData() {
+        mName = getIntent().getStringExtra(Constant.INTENT_NAME);
+        mCode = getIntent().getStringExtra(Constant.INTENT_CODE);
+        mPhoneNumber = getIntent().getStringExtra(Constant.INTENT_PHONENUMBER);
+        mCallNumber = getIntent().getStringExtra(Constant.INTENT_CALLNUMBER);
+        isSupportVideo = getIntent().getIntExtra(Constant.INTENT_VIDEO, 0);
+    }
+
+    private void initView() {
+        TextView nameTv = findViewById(R.id.nameTv);
+        TextView hintTv = findViewById(R.id.hintTv);
+        LinearLayout videoLayout = findViewById(R.id.videoLayout);
+        LinearLayout callLayout = findViewById(R.id.callLayout);
+
+        nameTv.setText(mName);
+        if (mCallNumber.length() > 0) {
+            hintTv.setText(mCallNumber);
+        } else {
+            hintTv.setText(mCode +" " + mPhoneNumber);
+        }
+
+        videoLayout.setVisibility(isSupportVideo > 0 ? View.VISIBLE : View.GONE);
+        videoLayout.setOnClickListener(v -> {
+
+        });
+        callLayout.setOnClickListener(v -> {
+            callAction(mCode, mPhoneNumber, mCallNumber);
+        });
+    }
+}

+ 9 - 5
app/src/main/java/com/sikey/skcontact/activity/ContactActivity.java

@@ -1,8 +1,10 @@
 package com.sikey.skcontact.activity;
 
+import android.content.Intent;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Bundle;
+import android.telecom.Call;
 import android.util.Log;
 import android.view.View;
 import android.widget.AdapterView;
@@ -17,8 +19,9 @@ import com.sikey.skcontact.utils.Constant;
 
 import java.util.ArrayList;
 
-public class ContactActivity extends BaseActivity {
+public class ContactActivity extends BaseCallActivity {
     public final String TAG = "losion / skcontact :" + getClass().getSimpleName();
+    private ArrayList<ContactBean> mContactList = new ArrayList<>();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -30,10 +33,10 @@ public class ContactActivity extends BaseActivity {
     }
 
     private void initData() {
-        ArrayList<ContactBean> contacts = DatabaseUtils.queryContacts(this);
-        for (int i = 0; i < contacts.size(); i++) {
+        mContactList = DatabaseUtils.queryContacts(this);
+        for (int i = 0; i < mContactList.size(); i++) {
             BaseModel model = new BaseModel();
-            model.title = contacts.get(i).name.trim();
+            model.title = mContactList.get(i).name.trim();
             model.cellType = Constant.CellType.TITLE;
             model.isShowArrow = false;
             mDataList.add(model);
@@ -49,7 +52,8 @@ public class ContactActivity extends BaseActivity {
         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-
+                ContactBean bean = mContactList.get(position);
+                showCall(bean.name, bean.countryPN, bean.phoneNumber, "", bean.isVideo);
             }
         });
     }

+ 3 - 3
app/src/main/java/com/sikey/skcontact/activity/DialActivity.java

@@ -5,8 +5,8 @@ import com.sikey.xpcontact.activity.BaseInputActivity;
 public class DialActivity extends BaseInputActivity {
 
     @Override
-    protected void onSureClick() {
-        super.onSureClick();
-
+    protected void onSureClick(String value) {
+        super.onSureClick(value);
+        showCall("", "", "", value, 0);
     }
 }

+ 8 - 7
app/src/main/java/com/sikey/skcontact/activity/RecentActivity.java

@@ -20,9 +20,9 @@ import com.sikey.skcontact.utils.Constant;
 import java.util.ArrayList;
 import java.util.List;
 
-public class RecentActivity extends BaseActivity {
+public class RecentActivity extends BaseCallActivity {
     public final String TAG = "losion / skcontact :" + getClass().getSimpleName();
-    public static List<RecentBean> mRecentBeanList = new ArrayList<>();
+    public static List<RecentBean> mRecentList = new ArrayList<>();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -38,22 +38,22 @@ public class RecentActivity extends BaseActivity {
         ArrayList<ContactBean> contacts = DatabaseUtils.queryContacts(this);
         List<RecentBean> arrayList = DatabaseUtils.queryRecent(this, offset);
         if (offset == 0) {
-            mRecentBeanList.clear();
+            mRecentList.clear();
         }
 
         for (RecentBean recentBean : arrayList) {
             ContactBean contactBean = DataManager.searchContact(recentBean, contacts);
             if (contactBean != null) {
                 recentBean.contactBean = contactBean;
-                mRecentBeanList.add(recentBean);
+                mRecentList.add(recentBean);
             }
         }
     }
 
     private void initData() {
-        for (int i = 0; i < mRecentBeanList.size(); i++) {
+        for (int i = 0; i < mRecentList.size(); i++) {
             BaseModel model = new BaseModel();
-            model.title = mRecentBeanList.get(i).caller.trim();
+            model.title = mRecentList.get(i).caller.trim();
             model.cellType = Constant.CellType.TITLE;
             model.isShowArrow = false;
             mDataList.add(model);
@@ -69,7 +69,8 @@ public class RecentActivity extends BaseActivity {
         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-
+                RecentBean bean = mRecentList.get(position);
+                showCall("", "", "", bean.caller, 0);
             }
         });
     }

+ 1 - 0
app/src/main/java/com/sikey/skcontact/manager/DataManager.java

@@ -2,6 +2,7 @@ package com.sikey.skcontact.manager;
 
 import android.content.Context;
 import android.provider.Settings;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.sikey.skcontact.model.ContactBean;

+ 1 - 0
app/src/main/java/com/sikey/skcontact/model/ContactBean.java

@@ -11,6 +11,7 @@ public class ContactBean extends BaseModel {
     public String countryPN = "";
     public int rate = 0;
     public int unRead = 0;
+    public int isVideo = 1; //是否支持视频通话
 
     // 1 : First guardian(SOS target)
     // 2 : Second guardian

+ 5 - 2
app/src/main/java/com/sikey/skcontact/utils/Constant.java

@@ -2,8 +2,11 @@ package com.sikey.skcontact.utils;
 
 public class Constant {
     public static String PACKAGE_NAME = "com.xplora.skcontact";
-    public final static String EXTRA_VIDEO_TYPE = "ExtraVideoType";
-    public final static String EXTRA_VIDEO_TARGET_ID = "ExtraVideoTargetId";
+    public static String INTENT_NAME = "intent_name";
+    public static String INTENT_CODE = "intent_code";
+    public static String INTENT_PHONENUMBER = "INTENT_PHONENUMBER";
+    public static String INTENT_CALLNUMBER = "INTENT_CALLNUMBER";
+    public static String INTENT_VIDEO = "intent_video";
 
     public enum CellType {
         TITLE,

BIN
app/src/main/res/drawable/app_contact.png


BIN
app/src/main/res/drawable/app_dial.png


BIN
app/src/main/res/drawable/app_recent.png


BIN
app/src/main/res/drawable/ic_call.png


BIN
app/src/main/res/drawable/ic_call_2.png


BIN
app/src/main/res/drawable/ic_videocall.png


BIN
app/src/main/res/drawable/input_delete.png


+ 90 - 0
app/src/main/res/layout/activity_call.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#000000"
+    >
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="25dp"
+        android:gravity="center"
+        android:orientation="vertical">
+        <TextView
+            android:id="@+id/nameTv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAlignment="center"
+            android:textColor="@color/white"
+            android:textSize="20sp"
+            android:textStyle="bold"
+            android:text="ssssssaa"
+            />
+        <TextView
+            android:id="@+id/hintTv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="1dp"
+            android:textAlignment="center"
+            android:textColor="#74777D"
+            android:textSize="17sp"
+            android:text="543543543534"
+            />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_marginBottom="8dp"
+        android:gravity="center"
+        >
+        <LinearLayout
+            android:id="@+id/videoLayout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="25dp"
+            android:orientation="vertical"
+            >
+            <ImageButton
+                android:layout_width="50dp"
+                android:layout_height="50dp"
+                android:background="@drawable/ic_videocall"
+                android:clickable="false"
+                />
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/video_call"
+                android:textAlignment="center"
+                android:textColor="#FFFFFF"
+                android:textSize="15sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/callLayout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="25dp"
+            android:layout_marginEnd="25dp"
+            android:orientation="vertical"
+            >
+            <ImageButton
+                android:layout_width="50dp"
+                android:layout_height="50dp"
+                android:background="@drawable/ic_call"
+                android:clickable="false"
+                />
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/call"
+                android:textAlignment="center"
+                android:textColor="#FFFFFF"
+                android:textSize="15sp" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+</RelativeLayout>

+ 5 - 1
app/src/main/res/layout/activity_input_code.xml

@@ -12,8 +12,12 @@
         android:id="@+id/text"
         android:layout_width="match_parent"
         android:layout_height="32dp"
+        android:layout_marginStart="5dp"
+        android:layout_marginEnd="5dp"
         android:layout_marginTop="10dp"
         android:gravity="center"
+        android:maxLines="1"
+        android:ellipsize="middle"
         android:textFontWeight="500"
         android:textColor="@color/white"
         android:textSize="17sp"
@@ -159,7 +163,7 @@
             android:layout_width="50dp"
             android:layout_height="match_parent"
             android:background="@drawable/bg_gray"
-            android:src="@drawable/input_sure"
+            android:src="@drawable/ic_call_2"
             android:layout_weight="1"
             android:tag="101" />
         <Button

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,9 @@
 <resources>
     <string name="app_name">SKContact</string>
+    <string name="app_dial">拨号</string>
+    <string name="app_contact">联系人</string>
+    <string name="app_recent">最近通话</string>
+    <string name="video_call">视频</string>
+    <string name="call">电话</string>
+    <string name="calling_interrupt">Call failed!</string>
 </resources>