am_dot_com

PDM2 20201126

Nov 26th, 2020 (edited)
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.76 KB | None | 0 0
  1. package com.joythis.android.mycaller;
  2.  
  3. import android.Manifest;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.net.Uri;
  8. import android.util.Log;
  9. import android.widget.Toast;
  10.  
  11. import androidx.annotation.StringDef;
  12. import androidx.core.app.ActivityCompat;
  13.  
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.Map;
  17.  
  18. public class AmUtil {
  19.     Activity mActivity;
  20.  
  21.     public AmUtil(Activity pA){
  22.         this.mActivity = pA;
  23.     }//AmUtil
  24.  
  25.     public void fb(String pMsg){
  26.         Toast t = Toast.makeText(
  27.             this.mActivity,
  28.             pMsg,
  29.             Toast.LENGTH_LONG
  30.         );
  31.         t.show();
  32.     }//fb
  33.  
  34.     public void phoneTo(
  35.         String pStrPhoneNumber
  36.     ){
  37.         String strUriForThePhoneNumber = "tel:"+pStrPhoneNumber;
  38.         try{
  39.             Uri uriForThePhoneNumber =
  40.                 Uri.parse(strUriForThePhoneNumber);
  41.  
  42.             if(uriForThePhoneNumber!=null){
  43.                 Intent intentForPhoneCallingTheNumber =
  44.                     new Intent(Intent.ACTION_CALL);
  45.  
  46.                 intentForPhoneCallingTheNumber.setData(uriForThePhoneNumber);
  47.  
  48.                 /*
  49.                 some Intents can NOT be simply called because
  50.                 they demand explicit verification of the permission necessary
  51.                  */
  52.                 boolean bPermissionToCallPhoneIsGranted =
  53.                     ActivityCompat.checkSelfPermission(
  54.                         this.mActivity,
  55.                         Manifest.permission.CALL_PHONE
  56.                     )==PackageManager.PERMISSION_GRANTED;
  57.  
  58.                 if (bPermissionToCallPhoneIsGranted) {
  59.                     this.mActivity.startActivity(intentForPhoneCallingTheNumber);
  60.                 }//if the permission is granted
  61.                 else{
  62.                     //what is the permission is denied?
  63.                     boolean bUserIsReceptiveToRationaleOfNeedToHavePermission =
  64.                         this.mActivity.shouldShowRequestPermissionRationale(
  65.                             Manifest.permission.CALL_PHONE
  66.                         );
  67.                     if (bUserIsReceptiveToRationaleOfNeedToHavePermission){
  68.                         this.fb(
  69.                         "Without the permission to call phone, you will NOT be able to make phone calls from this app."
  70.                         );
  71.                     }//if
  72.                 }//else
  73.             }//if got an Uri
  74.         }//try
  75.         catch (Exception e){
  76.             Log.e(
  77.                 this.getClass().getName(),
  78.                 e.toString()
  79.             );
  80.         }//catch
  81.     }//phoneTo
  82.  
  83.     public Map<Integer, ArrayList<String>>
  84.     getListsOfGrantedAndDeniedPermissions(
  85.         String[] paNecessaryPermissions
  86.     ){
  87.         Map<Integer, ArrayList<String>> mapRet = new HashMap<>();
  88.  
  89.         ArrayList<String> alGranted = new ArrayList<>();
  90.         ArrayList<String> alDenied = new ArrayList<>();
  91.  
  92.         for(String strCurrentPerm : paNecessaryPermissions){
  93.             boolean bGranted =
  94.                 ActivityCompat.checkSelfPermission(
  95.                     this.mActivity,
  96.                     strCurrentPerm
  97.                 ) == PackageManager.PERMISSION_GRANTED;
  98.  
  99.             boolean bDenied =
  100.                 ActivityCompat.checkSelfPermission(
  101.                         this.mActivity,
  102.                         strCurrentPerm
  103.                 ) == PackageManager.PERMISSION_DENIED;
  104.  
  105.             if (bGranted) alGranted.add(strCurrentPerm);
  106.  
  107.             if (bDenied) alDenied.add(strCurrentPerm);
  108.         }//for
  109.  
  110.         mapRet.put(
  111.             PackageManager.PERMISSION_GRANTED,
  112.             alGranted
  113.         );
  114.         mapRet.put(
  115.             PackageManager.PERMISSION_DENIED,
  116.             alDenied
  117.         );
  118.         return mapRet;
  119.     }//getListsOfGrantedAndDeniedPermissions
  120.  
  121.     public String getPermissionStatus(
  122.         String[] paNecessaryPermissions
  123.     ){
  124.         String strRet = "";
  125.  
  126.         Map<Integer, ArrayList<String>> mapOfGrantedAndDeniedPerms =
  127.             getListsOfGrantedAndDeniedPermissions(
  128.                 paNecessaryPermissions
  129.             );
  130.  
  131.         ArrayList<String> alGranted =
  132.                 mapOfGrantedAndDeniedPerms.get
  133.                         (PackageManager.PERMISSION_GRANTED);
  134.  
  135.         ArrayList<String> alDenied =
  136.                 mapOfGrantedAndDeniedPerms.get
  137.                         (PackageManager.PERMISSION_DENIED);
  138.  
  139.  
  140.         String strGranted = "";
  141.         for (String strGrantedPerm : alGranted){
  142.             strGranted+=strGrantedPerm+"\n";
  143.         }//for
  144.  
  145.         String strDenied = "";
  146.         for (String strDeniedPerm : alDenied){
  147.             strDenied+=strDeniedPerm+"\n";
  148.         }//for
  149.  
  150.         strRet = String.format(
  151.             "GRANTED permission(s):\n%s\n"+
  152.             "DENIED permission(s):\n%s\n",
  153.             strGranted,
  154.             strDenied
  155.         );
  156.  
  157.         return strRet;
  158.     }//getPermissionStatus
  159. }//AmUtil
  160.  
  161.  
  162. //**
  163.  
  164. package com.joythis.android.mycaller;
  165.  
  166. import androidx.annotation.NonNull;
  167. import androidx.appcompat.app.AppCompatActivity;
  168.  
  169. import android.Manifest;
  170. import android.content.Context;
  171. import android.os.Bundle;
  172. import android.view.Menu;
  173. import android.view.MenuInflater;
  174. import android.view.MenuItem;
  175. import android.view.View;
  176. import android.widget.AdapterView;
  177. import android.widget.ArrayAdapter;
  178. import android.widget.Button;
  179. import android.widget.EditText;
  180. import android.widget.ListView;
  181.  
  182. import java.util.ArrayList;
  183.  
  184. public class MainActivity extends AppCompatActivity {
  185.  
  186.     //1
  187.     String[] NECESSARY_PERMISSIONS = {
  188.         Manifest.permission.CALL_PHONE
  189.     };
  190.  
  191.     ListView.OnItemLongClickListener
  192.     mLvItemLongClickHandler = new ListView.OnItemLongClickListener() {
  193.         @Override
  194.         public boolean onItemLongClick(
  195.             AdapterView<?> parent,
  196.             View view, //is the view in the ListView on which I long-clicked
  197.             int position, //the index of the corresponding contact in mAlContacts
  198.             long id)
  199.         {
  200.             Contact c = mAlContacts.get(position);
  201.             String strName = c.getmName();
  202.             String strNumber = c.getmNumber();
  203.             mUtil.fb("will call to "+strNumber);
  204.  
  205.             mUtil.phoneTo(strNumber);
  206.  
  207.             //return false; //false - the event was NOT fully processed
  208.             return true; //true - the event was fully processed (a click listener would NOT happen)
  209.         }//onItemLongClick
  210.     };
  211.  
  212.  
  213.     Button.OnClickListener mBtnClickHandler = new Button.OnClickListener() {
  214.         @Override
  215.         public void onClick(View v) {
  216.             switch(v.getId()){
  217.                 case R.id.idBtnInsertContact:
  218.                     actionInsertContact();
  219.                     break;
  220.             }//switch
  221.         }//onClick
  222.     };//mBtnClickHandler
  223.  
  224.     void actionInsertContact(){
  225.         String strContactName = mEtContactName.getText().toString();
  226.         String strContactNumber = mEtContactNumber.getText().toString();
  227.  
  228.         Contact c = new Contact(
  229.             strContactName,
  230.             strContactNumber
  231.         );
  232.  
  233.         long iWhereItWasInserted = mContactDB.insertContact(c);
  234.  
  235.         /*
  236.         Toast t = Toast.makeText(
  237.             this,
  238.             String.valueOf(iWhereItWasInserted),
  239.             Toast.LENGTH_LONG
  240.         );
  241.         t.show();
  242.          */
  243.         mUtil.fb(
  244.             String.valueOf(iWhereItWasInserted)
  245.         );
  246.  
  247.         syncLvContactsWithDB();
  248.     }//actionInsertContact
  249.  
  250.     //data member to enable access to database operations
  251.     //such as insert and select
  252.     ContactDB mContactDB;
  253.     Context mContext;
  254.  
  255.     AmUtil mUtil;
  256.  
  257.     EditText mEtContactName, mEtContactNumber;
  258.     Button mBtnInsertContact;
  259.     ListView mLvContacts;
  260.     ArrayList<Contact> mAlContacts;
  261.     ArrayAdapter<Contact> mAd;
  262.  
  263.     @Override
  264.     protected void onCreate(Bundle savedInstanceState) {
  265.         super.onCreate(savedInstanceState);
  266.         setContentView(R.layout.insert_contact_rl);
  267.  
  268.         init();
  269.     }//onCreate
  270.  
  271.     void init(){
  272.         mContext = this;
  273.         mUtil = new AmUtil(this);
  274.  
  275.         mEtContactName = findViewById(R.id.idEtContactName);
  276.         mEtContactNumber = findViewById(R.id.idEtContactNumber);
  277.  
  278.         mBtnInsertContact = findViewById(R.id.idBtnInsertContact);
  279.         mBtnInsertContact.setOnClickListener(
  280.             mBtnClickHandler //data abstraction
  281.         );
  282.  
  283.         mLvContacts = findViewById(R.id.idLvContacts);
  284.         mLvContacts.setOnItemLongClickListener(
  285.             mLvItemLongClickHandler
  286.         );
  287.  
  288.         mAlContacts = new ArrayList<>();
  289.  
  290.         mContactDB = new ContactDB(mContext);
  291.  
  292.         mAd = new ArrayAdapter<>(
  293.             mContext,
  294.             android.R.layout.simple_list_item_1,
  295.             mAlContacts
  296.         );
  297.         mLvContacts.setAdapter(mAd);
  298.  
  299.         syncLvContactsWithDB();
  300.  
  301.         /*
  302.         mContactDB.insertContact
  303.             (new Contact("Artur", "123"));
  304.  
  305.         ArrayList<Contact> all = mContactDB.selectAll();
  306.          */
  307.  
  308.     }//init
  309.  
  310.     void syncLvContactsWithDB(){
  311.         ArrayList<Contact> alTemp =
  312.             mContactDB.selectAllByInsertDateDESC();
  313.         if (alTemp!=null && alTemp.size()>0){
  314.             mAlContacts.clear();
  315.             for (Contact c : alTemp){
  316.                 mAlContacts.add(c);
  317.             }//for
  318.             mAd.notifyDataSetChanged();
  319.         }//if
  320.     }//syncLvContactsWithDB
  321.  
  322.     void syncLvContactsWithDB(
  323.         ArrayList<Contact> pContacts
  324.     ){
  325.         if (pContacts!=null && pContacts.size()>0){
  326.             mAlContacts.clear();
  327.             for (Contact c : pContacts){
  328.                 mAlContacts.add(c);
  329.             }//for
  330.             mAd.notifyDataSetChanged();
  331.         }//if
  332.     }//syncLvContactsWithDB
  333.  
  334.     //attaches the menu to the Activity
  335.     @Override
  336.     public boolean onCreateOptionsMenu(Menu pMenu) {
  337.         MenuInflater minf = new MenuInflater(mContext);
  338.         if (minf!=null){
  339.             minf.inflate(
  340.                 R.menu.menu_sort_options,
  341.                 pMenu
  342.             );
  343.         }
  344.         return super.onCreateOptionsMenu(pMenu);
  345.     }//onCreateOptionsMenu
  346.  
  347.     //this sets the menu's behavior
  348.     @Override
  349.     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  350.         switch(item.getItemId()){
  351.             case R.id.idMenuItemSortIdAsc:
  352.                 syncLvContactsWithDB(
  353.                     mContactDB.selectAllByInsertDateASC()
  354.                 );
  355.                 break;
  356.             case R.id.idMenuItemSortIdDesc:
  357.                 syncLvContactsWithDB(
  358.                     mContactDB.selectAllByInsertDateDESC()
  359.                 );
  360.                 break;
  361.             case R.id.idMenuItemSortNameAsc:
  362.                 syncLvContactsWithDB(
  363.                     mContactDB.selectAllByNameASC()
  364.                 );
  365.                 break;
  366.             case R.id.idMenuItemSortNameDesc:
  367.                 syncLvContactsWithDB(
  368.                     mContactDB.selectAllByNameDESC()
  369.                 );
  370.                 break;
  371.             case R.id.idMenuItemSortNumberAsc:
  372.                 syncLvContactsWithDB(
  373.                     mContactDB.selectAllByNumberASC()
  374.                 );
  375.                 break;
  376.             case R.id.idMenuItemSortNumberDesc:
  377.                 syncLvContactsWithDB(
  378.                     mContactDB.selectAllByNumberDESC()
  379.                 );
  380.                 break;
  381.  
  382.             case R.id.idMenuItemSeeGrantedAndDenied:
  383.                 String strGrantedAndDenied =
  384.                     mUtil.getPermissionStatus(
  385.                         NECESSARY_PERMISSIONS
  386.                     );
  387.                 mUtil.fb(strGrantedAndDenied);
  388.                 break;
  389.  
  390.         }//switch
  391.         return super.onOptionsItemSelected(item);
  392.     }
  393. }//MainActivity
  394.  
  395. //**
  396.  
  397. <?xml version="1.0" encoding="utf-8"?>
  398. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  399.  
  400.     <item
  401.         android:id="@+id/idMenuItemSortNameAsc"
  402.         android:title="@string/strMenuItemSortNameAsc"/>
  403.  
  404.     <item
  405.         android:id="@+id/idMenuItemSortNameDesc"
  406.         android:title="@string/strMenuItemSortNameDesc"/>
  407.  
  408.     <item
  409.         android:id="@+id/idMenuItemSortNumberAsc"
  410.         android:title="@string/strMenuItemSortNumberAsc"/>
  411.  
  412.     <item
  413.         android:id="@+id/idMenuItemSortNumberDesc"
  414.         android:title="@string/strMenuItemSortNumberDesc"/>
  415.  
  416.     <item
  417.         android:id="@+id/idMenuItemSortIdAsc"
  418.         android:title="@string/strMenuItemSortIdAsc"/>
  419.  
  420.     <item
  421.         android:id="@+id/idMenuItemSortIdDesc"
  422.         android:title="@string/strMenuItemSortIdDesc"/>
  423.  
  424.     <item
  425.         android:id="@+id/idMenuItemSeeGrantedAndDenied"
  426.         android:title="@string/strMenuItemSeeGranted"/>
  427. </menu>
Advertisement
Add Comment
Please, Sign In to add comment