2019-07-10 04:37:52 +03:00
package com.blogspot.developersu.ns_usbloader ;
import androidx.annotation.NonNull ;
import androidx.annotation.Nullable ;
import androidx.appcompat.app.ActionBarDrawerToggle ;
import androidx.appcompat.app.AppCompatActivity ;
2020-08-03 14:02:24 +03:00
import androidx.appcompat.app.AppCompatDelegate ;
2019-07-10 04:37:52 +03:00
import androidx.appcompat.widget.Toolbar ;
2020-08-03 14:02:24 +03:00
import androidx.core.content.ContextCompat ;
2019-07-10 04:37:52 +03:00
import androidx.core.view.GravityCompat ;
import androidx.drawerlayout.widget.DrawerLayout ;
import androidx.recyclerview.widget.ItemTouchHelper ;
import androidx.recyclerview.widget.LinearLayoutManager ;
import androidx.recyclerview.widget.RecyclerView ;
import android.app.PendingIntent ;
import android.content.BroadcastReceiver ;
import android.content.Context ;
import android.content.Intent ;
import android.content.IntentFilter ;
import android.content.SharedPreferences ;
import android.hardware.usb.UsbDevice ;
import android.hardware.usb.UsbManager ;
import android.net.Uri ;
import android.os.Bundle ;
import android.os.Handler ;
import android.view.Menu ;
import android.view.MenuItem ;
import android.widget.Button ;
import android.widget.ProgressBar ;
2020-03-23 20:33:17 +03:00
import com.blogspot.developersu.ns_usbloader.model.NsResultReciever ;
import com.blogspot.developersu.ns_usbloader.service.CommunicationsService ;
import com.blogspot.developersu.ns_usbloader.view.NSPElement ;
import com.blogspot.developersu.ns_usbloader.view.NspItemsAdapter ;
2019-07-10 04:37:52 +03:00
import com.google.android.material.navigation.NavigationView ;
import com.google.android.material.snackbar.Snackbar ;
import java.util.ArrayList ;
import java.util.HashMap ;
// TODO: add ImageAsset for notification icon instead of SVG-like
// TODO NOTE: If service execution has been finished in background, then no UI updates will come
public class MainActivity extends AppCompatActivity implements NsResultReciever . Receiver ,
NavigationView . OnNavigationItemSelectedListener { //TODO: FIX?
private static final int ADD_NSP_INTENT_CODE = 1 ;
private RecyclerView recyclerView ;
private NspItemsAdapter mAdapter ;
private ArrayList < NSPElement > mDataset ;
private BroadcastReceiver innerBroadcastReceiver ;
private UsbDevice usbDevice ;
private boolean isUsbDeviceAccessible ;
2020-08-03 14:02:24 +03:00
private Button selectBtn ,
uploadToNsBtn ;
2019-07-10 04:37:52 +03:00
private ProgressBar progressBarMain ;
private NavigationView drawerNavView ;
private NsResultReciever nsResultReciever ;
2020-08-03 14:02:24 +03:00
static {
AppCompatDelegate . setCompatVectorFromResourcesEnabled ( true ) ;
}
2019-07-10 04:37:52 +03:00
@Override
2020-03-23 20:33:17 +03:00
protected void onSaveInstanceState ( @NonNull Bundle outState ) {
2019-07-10 04:37:52 +03:00
super . onSaveInstanceState ( outState ) ;
outState . putParcelableArrayList ( "DATASET_LIST" , mDataset ) ;
outState . putParcelable ( "USB_DEVICE" , usbDevice ) ;
outState . putBoolean ( "IS_USB_DEV_ACCESSIBLE" , isUsbDeviceAccessible ) ;
if ( drawerNavView . getCheckedItem ( ) ! = null )
outState . putInt ( "PROTOCOL" , drawerNavView . getCheckedItem ( ) . getItemId ( ) ) ;
else
outState . putInt ( "PROTOCOL" , R . id . nav_tf_usb ) ;
outState . putParcelable ( "RECEIVER" , nsResultReciever ) ;
}
@Override
protected void onResume ( ) {
super . onResume ( ) ;
// Configure intent to receive attached NS
innerBroadcastReceiver = new InnerBroadcastReceiver ( ) ;
IntentFilter intentFilter = new IntentFilter ( ) ;
intentFilter . addAction ( UsbManager . ACTION_USB_DEVICE_ATTACHED ) ;
intentFilter . addAction ( UsbManager . ACTION_USB_DEVICE_DETACHED ) ;
intentFilter . addAction ( NsConstants . REQUEST_NS_ACCESS_INTENT ) ;
intentFilter . addAction ( NsConstants . SERVICE_TRANSFER_TASK_FINISHED_INTENT ) ;
registerReceiver ( innerBroadcastReceiver , intentFilter ) ;
nsResultReciever . setReceiver ( this ) ;
blockUI ( CommunicationsService . isServiceActive ( ) ) ;
}
@Override
protected void onPause ( ) {
super . onPause ( ) ;
unregisterReceiver ( innerBroadcastReceiver ) ;
SharedPreferences . Editor preferencesEditor = getSharedPreferences ( "NSUSBloader" , MODE_PRIVATE ) . edit ( ) ;
if ( drawerNavView . getCheckedItem ( ) ! = null ) {
switch ( drawerNavView . getCheckedItem ( ) . getItemId ( ) ) {
case R . id . nav_tf_usb :
preferencesEditor . putInt ( "PROTOCOL" , NsConstants . PROTO_TF_USB ) ;
break ;
case R . id . nav_tf_net :
preferencesEditor . putInt ( "PROTOCOL" , NsConstants . PROTO_TF_NET ) ;
break ;
case R . id . nav_gl :
preferencesEditor . putInt ( "PROTOCOL" , NsConstants . PROTO_GL_USB ) ;
break ;
}
}
else
preferencesEditor . putInt ( "PROTOCOL" , NsConstants . PROTO_TF_USB ) ;
preferencesEditor . apply ( ) ;
nsResultReciever . setReceiver ( null ) ;
}
@Override
public boolean onCreateOptionsMenu ( Menu menu ) {
getMenuInflater ( ) . inflate ( R . menu . activity_main_toolbar , menu ) ;
MenuItem selectAllBtn = menu . findItem ( R . id . select_all ) ;
selectAllBtn . setOnMenuItemClickListener ( menuItem - > {
if ( drawerNavView . getCheckedItem ( ) ! = null ) {
if ( drawerNavView . getCheckedItem ( ) . getItemId ( ) = = R . id . nav_gl )
Snackbar . make ( findViewById ( android . R . id . content ) , getString ( R . string . one_item_for_gl_notification ) , Snackbar . LENGTH_LONG ) . show ( ) ;
else {
if ( mDataset . isEmpty ( ) )
return true ;
for ( NSPElement element : mDataset ) {
element . setSelected ( true ) ;
}
mAdapter . notifyDataSetChanged ( ) ;
}
}
return true ;
} ) ;
return true ;
}
//*/
// Handle back button push when drawer opened
@Override
public void onBackPressed ( ) {
2020-03-23 20:33:17 +03:00
final DrawerLayout drawer = findViewById ( R . id . drawer_layout ) ;
if ( drawer . isDrawerOpen ( GravityCompat . START ) )
2019-07-10 04:37:52 +03:00
drawer . closeDrawer ( GravityCompat . START ) ;
2020-03-23 20:33:17 +03:00
else
2019-07-10 04:37:52 +03:00
super . onBackPressed ( ) ;
}
// Drawer actions
@Override
public boolean onNavigationItemSelected ( MenuItem item ) {
// Handle navigation view item clicks here.
2020-03-23 20:33:17 +03:00
switch ( item . getItemId ( ) ) {
case R . id . nav_gl :
if ( ! mDataset . isEmpty ( ) ) {
for ( NSPElement element : mDataset )
element . setSelected ( false ) ;
mAdapter . notifyDataSetChanged ( ) ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
break ;
case R . id . nav_settings :
startActivity ( new Intent ( this , SettingsActivity . class ) ) ;
break ;
case R . id . nav_about :
startActivity ( new Intent ( this , AboutActivity . class ) ) ;
//case R.id.nav_tf_usb:
//case R.id.nav_tf_net:
2019-07-10 04:37:52 +03:00
}
DrawerLayout drawer = findViewById ( R . id . drawer_layout ) ;
drawer . closeDrawer ( GravityCompat . START ) ;
return true ;
}
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
setContentView ( R . layout . activity_main ) ;
// Initialize ToolBar
Toolbar toolbar = findViewById ( R . id . toolbar ) ;
setSupportActionBar ( toolbar ) ;
DrawerLayout drawer = findViewById ( R . id . drawer_layout ) ;
drawerNavView = findViewById ( R . id . nav_view ) ;
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle (
this , drawer , toolbar , R . string . navigation_drawer_open , R . string . navigation_drawer_close ) ;
drawer . addDrawerListener ( toggle ) ;
toggle . syncState ( ) ;
drawerNavView . setNavigationItemSelectedListener ( this ) ;
// Initialize Progress Bar
progressBarMain = findViewById ( R . id . mainProgressBar ) ;
// Configure data set in case it's restored from screen rotation or something
if ( savedInstanceState ! = null ) {
mDataset = savedInstanceState . getParcelableArrayList ( "DATASET_LIST" ) ;
// Restore USB device information
usbDevice = savedInstanceState . getParcelable ( "USB_DEVICE" ) ;
isUsbDeviceAccessible = savedInstanceState . getBoolean ( "IS_USB_DEV_ACCESSIBLE" , false ) ;
drawerNavView . setCheckedItem ( savedInstanceState . getInt ( "PROTOCOL" , R . id . nav_tf_usb ) ) ;
nsResultReciever = savedInstanceState . getParcelable ( "RECEIVER" ) ;
}
else {
mDataset = new ArrayList < > ( ) ;
usbDevice = getIntent ( ) . getParcelableExtra ( UsbManager . EXTRA_DEVICE ) ; // If it's started initially, then check if it's started from notification.
2020-08-03 14:02:24 +03:00
//Log.i("LPR", "DEVICE " +usbDevice);
2019-07-10 04:37:52 +03:00
if ( usbDevice ! = null ) {
UsbManager usbManager = ( UsbManager ) getSystemService ( Context . USB_SERVICE ) ;
// If somehow we can't get system service
if ( usbManager = = null ) {
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , "Internal issue: getSystemService(Context.USB_SERVICE) returned null" ) ;
return ; // ??? HOW ???
}
isUsbDeviceAccessible = usbManager . hasPermission ( usbDevice ) ;
}
else
isUsbDeviceAccessible = false ;
switch ( getSharedPreferences ( "NSUSBloader" , MODE_PRIVATE ) . getInt ( "PROTOCOL" , NsConstants . PROTO_TF_USB ) ) {
case NsConstants . PROTO_TF_USB :
drawerNavView . setCheckedItem ( R . id . nav_tf_usb ) ;
break ;
case NsConstants . PROTO_TF_NET :
drawerNavView . setCheckedItem ( R . id . nav_tf_net ) ;
break ;
case NsConstants . PROTO_GL_USB :
drawerNavView . setCheckedItem ( R . id . nav_gl ) ;
break ;
default :
}
nsResultReciever = new NsResultReciever ( new Handler ( ) ) ; // We will set callback in onResume and unset onPause
}
recyclerView = findViewById ( R . id . recyclerView ) ;
RecyclerView . LayoutManager layoutManager = new LinearLayoutManager ( this ) ;
recyclerView . setLayoutManager ( layoutManager ) ;
mAdapter = new NspItemsAdapter ( mDataset ) ;
recyclerView . setAdapter ( mAdapter ) ;
2020-03-23 20:33:17 +03:00
this . setSwipeFunctionsToView ( ) ;
// Select files button
selectBtn = findViewById ( R . id . buttonSelect ) ;
selectBtn . setOnClickListener ( e - > {
Intent fileChooser = new Intent ( Intent . ACTION_GET_CONTENT ) ;
fileChooser . setType ( "application/octet-stream" ) ; //fileChooser.setType("*/*"); ???
if ( fileChooser . resolveActivity ( getPackageManager ( ) ) ! = null )
startActivityForResult ( Intent . createChooser ( fileChooser , getString ( R . string . select_file_btn ) ) , ADD_NSP_INTENT_CODE ) ;
else
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , getResources ( ) . getString ( R . string . install_file_explorer ) ) ;
} ) ;
// Upload to NS button
uploadToNsBtn = findViewById ( R . id . buttonUpload ) ;
}
private void updateUploadBtnState ( ) { // TODO: this function is bad. It multiplies entropy and sorrow.
uploadToNsBtn . setEnabled ( mAdapter . getItemCount ( ) > 0 ) ;
}
/ * *
* @see MainActivity # onCreate
* * /
private void setSwipeFunctionsToView ( ) {
2019-07-10 04:37:52 +03:00
ItemTouchHelper . Callback ithCallBack = new ItemTouchHelper . Callback ( ) {
@Override
public int getMovementFlags ( @NonNull RecyclerView recyclerView , @NonNull RecyclerView . ViewHolder viewHolder ) {
return makeMovementFlags ( ItemTouchHelper . UP | ItemTouchHelper . DOWN , ItemTouchHelper . LEFT | ItemTouchHelper . RIGHT ) ;
}
@Override
public boolean onMove ( @NonNull RecyclerView recyclerView , @NonNull RecyclerView . ViewHolder viewHolder , @NonNull RecyclerView . ViewHolder target ) {
mAdapter . move ( viewHolder . getAdapterPosition ( ) , target . getAdapterPosition ( ) ) ;
return true ;
}
@Override
public void onSwiped ( @NonNull RecyclerView . ViewHolder viewHolder , int direction ) {
NspItemsAdapter . NspViewHolder nspViewHolder = ( NspItemsAdapter . NspViewHolder ) viewHolder ;
mDataset . remove ( nspViewHolder . getData ( ) ) ;
mAdapter . notifyDataSetChanged ( ) ;
updateUploadBtnState ( ) ;
}
} ;
ItemTouchHelper itemTouchHelper = new ItemTouchHelper ( ithCallBack ) ;
itemTouchHelper . attachToRecyclerView ( recyclerView ) ;
}
@Override
protected void onActivityResult ( int requestCode , int resultCode , @Nullable Intent data ) {
2020-03-23 20:33:17 +03:00
super . onActivityResult ( requestCode , resultCode , data ) ;
2019-07-10 04:37:52 +03:00
//Snackbar.make(findViewById(android.R.id.content), requestCode+" "+resultCode, Snackbar.LENGTH_SHORT).show();
if ( requestCode ! = ADD_NSP_INTENT_CODE | | data = = null )
return ;
Uri uri = data . getData ( ) ;
2020-03-23 20:33:17 +03:00
if ( uri = = null | | uri . getScheme ( ) = = null | | ! uri . getScheme ( ) . equals ( "content" ) )
2019-07-10 04:37:52 +03:00
return ;
String fileName = LoperHelpers . getFileNameFromUri ( uri , this ) ;
long fileSize = LoperHelpers . getFileSizeFromUri ( uri , this ) ;
if ( fileName = = null | | fileSize < 0 ) {
2020-03-23 20:33:17 +03:00
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , getResources ( ) . getString ( R . string . popup_incorrect_file ) ) ;
2019-07-10 04:37:52 +03:00
return ;
}
2020-03-23 20:33:17 +03:00
String fileExtension = fileName . replaceAll ( "^.*\\." , "" ) . toLowerCase ( ) ;
switch ( fileExtension ) {
case "nsp" :
case "nsz" :
case "xci" :
case "xcz" :
break ;
default :
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , getResources ( ) . getString ( R . string . popup_non_supported_format ) ) ;
return ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
boolean isAlreadyAddedElement = false ;
2019-07-10 04:37:52 +03:00
for ( NSPElement element : mDataset ) {
if ( element . getFilename ( ) . equals ( fileName ) ) {
2020-03-23 20:33:17 +03:00
isAlreadyAddedElement = true ;
2019-07-10 04:37:52 +03:00
break ;
}
}
2020-03-23 20:33:17 +03:00
if ( isAlreadyAddedElement )
2019-07-10 04:37:52 +03:00
return ;
2020-03-23 20:33:17 +03:00
NSPElement element = new NSPElement ( uri , fileName , fileSize ) ;
if ( drawerNavView . getCheckedItem ( ) ! = null ) // && drawerNavView.getCheckedItem().getItemId() != R.id.nav_gl
element . setSelected ( true ) ;
mDataset . add ( element ) ;
2019-07-10 04:37:52 +03:00
mAdapter . notifyDataSetChanged ( ) ;
// Enable upload button
updateUploadBtnState ( ) ;
}
2020-03-23 20:33:17 +03:00
private void uploadFiles ( ) {
ArrayList < NSPElement > NSPElementsToSend = new ArrayList < > ( ) ;
2019-07-10 04:37:52 +03:00
for ( NSPElement element : mDataset ) {
if ( element . isSelected ( ) )
2020-03-23 20:33:17 +03:00
NSPElementsToSend . add ( element ) ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
// Do we have files to send?
if ( NSPElementsToSend . isEmpty ( ) ) {
2019-07-10 04:37:52 +03:00
Snackbar . make ( findViewById ( android . R . id . content ) , getString ( R . string . nothing_selected_message ) , Snackbar . LENGTH_LONG ) . show ( ) ;
return ;
}
2020-03-23 20:33:17 +03:00
// Do we have selected protocol?
2019-07-10 04:37:52 +03:00
if ( drawerNavView . getCheckedItem ( ) = = null ) {
Snackbar . make ( findViewById ( android . R . id . content ) , getString ( R . string . no_protocol_selected_message ) , Snackbar . LENGTH_LONG ) . show ( ) ;
return ;
}
2020-03-23 20:33:17 +03:00
Intent serviceStartIntent = new Intent ( this , CommunicationsService . class ) ;
serviceStartIntent . putExtra ( NsConstants . NS_RESULT_RECEIVER , nsResultReciever ) ;
serviceStartIntent . putParcelableArrayListExtra ( NsConstants . SERVICE_CONTENT_NSP_LIST , NSPElementsToSend ) ;
// Is it TF Net transfer?
if ( drawerNavView . getCheckedItem ( ) . getItemId ( ) = = R . id . nav_tf_net ) {
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PROTOCOL , NsConstants . PROTO_TF_NET ) ;
SharedPreferences sp = getSharedPreferences ( "NSUSBloader" , MODE_PRIVATE ) ;
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_NS_DEVICE_IP , sp . getString ( "SNsIP" , "192.168.1.42" ) ) ;
if ( sp . getBoolean ( "SAutoIP" , true ) )
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PHONE_IP , "" ) ;
else
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PHONE_IP , sp . getString ( "SServerIP" , "192.168.1.142" ) ) ;
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PHONE_PORT , sp . getInt ( "SServerPort" , 6042 ) ) ;
startService ( serviceStartIntent ) ;
blockUI ( true ) ;
return ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
// Ok, so it's something USB related
2019-07-10 04:37:52 +03:00
UsbManager usbManager = ( UsbManager ) getSystemService ( Context . USB_SERVICE ) ;
2020-03-23 20:33:17 +03:00
// Do we have manager?
2019-07-10 04:37:52 +03:00
if ( usbManager = = null ) {
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , "Internal issue: getSystemService(Context.USB_SERVICE) returned null" ) ;
2020-03-23 20:33:17 +03:00
return ;
2019-07-10 04:37:52 +03:00
}
// If device not connected
if ( usbDevice = = null ) {
HashMap < String , UsbDevice > deviceHashMap ;
deviceHashMap = usbManager . getDeviceList ( ) ;
for ( UsbDevice device : deviceHashMap . values ( ) ) {
if ( device . getVendorId ( ) = = 1406 & & device . getProductId ( ) = = 12288 ) {
usbDevice = device ;
}
}
// If it's still not connected then it's really not connected.
if ( usbDevice = = null ) {
NsNotificationPopUp . getAlertWindow ( this , getResources ( ) . getString ( R . string . popup_error ) , getResources ( ) . getString ( R . string . ns_not_found_in_connected ) ) ;
return ;
}
// If we have NS connected check for permissions
if ( ! usbManager . hasPermission ( usbDevice ) ) {
usbManager . requestPermission ( usbDevice , PendingIntent . getBroadcast ( this , 0 , new Intent ( NsConstants . REQUEST_NS_ACCESS_INTENT ) , 0 ) ) ;
return ;
}
}
if ( ! isUsbDeviceAccessible ) {
usbManager . requestPermission ( usbDevice , PendingIntent . getBroadcast ( this , 0 , new Intent ( NsConstants . REQUEST_NS_ACCESS_INTENT ) , 0 ) ) ;
return ;
}
switch ( drawerNavView . getCheckedItem ( ) . getItemId ( ) ) {
case R . id . nav_tf_usb :
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PROTOCOL , NsConstants . PROTO_TF_USB ) ;
break ;
case R . id . nav_gl :
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_PROTOCOL , NsConstants . PROTO_GL_USB ) ;
break ;
2020-03-23 20:33:17 +03:00
default :
Snackbar . make ( findViewById ( android . R . id . content ) , getString ( R . string . unknown_protocol_error ) , Snackbar . LENGTH_LONG ) . show ( ) ; // ?_?
return ;
2019-07-10 04:37:52 +03:00
}
serviceStartIntent . putExtra ( NsConstants . SERVICE_CONTENT_NS_DEVICE , usbDevice ) ;
startService ( serviceStartIntent ) ;
blockUI ( true ) ;
}
2020-03-23 20:33:17 +03:00
private void blockUI ( boolean shouldBlock ) {
if ( shouldBlock ) {
2019-07-10 04:37:52 +03:00
selectBtn . setEnabled ( false ) ;
2020-03-23 20:33:17 +03:00
recyclerView . suppressLayout ( true ) ;
2020-08-03 14:02:24 +03:00
uploadToNsBtn . setCompoundDrawablesWithIntrinsicBounds ( null , ContextCompat . getDrawable ( this , R . drawable . ic_cancel ) , null , null ) ;
2019-07-10 04:37:52 +03:00
uploadToNsBtn . setText ( R . string . interrupt_btn ) ;
2020-03-23 20:33:17 +03:00
uploadToNsBtn . setOnClickListener ( e - > stopService ( new Intent ( this , CommunicationsService . class ) ) ) ;
2019-07-10 04:37:52 +03:00
progressBarMain . setVisibility ( ProgressBar . VISIBLE ) ;
progressBarMain . setIndeterminate ( true ) ; //TODO
2020-03-23 20:33:17 +03:00
uploadToNsBtn . setEnabled ( true ) ;
return ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
selectBtn . setEnabled ( true ) ;
recyclerView . suppressLayout ( false ) ;
2020-08-03 14:02:24 +03:00
uploadToNsBtn . setCompoundDrawablesWithIntrinsicBounds ( null , ContextCompat . getDrawable ( this , R . drawable . ic_upload_btn ) , null , null ) ;
2020-03-23 20:33:17 +03:00
uploadToNsBtn . setText ( R . string . upload_btn ) ;
uploadToNsBtn . setOnClickListener ( e - > this . uploadFiles ( ) ) ;
progressBarMain . setVisibility ( ProgressBar . INVISIBLE ) ;
this . updateUploadBtnState ( ) ;
2019-07-10 04:37:52 +03:00
}
2020-03-23 20:33:17 +03:00
/ * *
* Handle service updates
* * /
2019-07-10 04:37:52 +03:00
@Override
2020-03-23 20:33:17 +03:00
public void onReceiveResults ( int code , Bundle bundle ) {
2019-07-10 04:37:52 +03:00
if ( code = = NsConstants . NS_RESULT_PROGRESS_INDETERMINATE )
progressBarMain . setIndeterminate ( true ) ;
else { // Else NsConstants.NS_RESULT_PROGRESS_VALUE ; ALSO THIS PART IS FULL OF SHIT
if ( progressBarMain . isIndeterminate ( ) )
progressBarMain . setIndeterminate ( false ) ;
progressBarMain . setProgress ( bundle . getInt ( "POSITION" ) ) ;
}
}
2020-03-23 20:33:17 +03:00
/ * *
* Deal with global broadcast intents
* * /
2019-07-10 04:37:52 +03:00
private class InnerBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context , Intent intent ) {
if ( intent . getAction ( ) = = null )
return ;
switch ( intent . getAction ( ) ) {
case UsbManager . ACTION_USB_DEVICE_ATTACHED :
usbDevice = intent . getParcelableExtra ( UsbManager . EXTRA_DEVICE ) ;
UsbManager usbManager = ( UsbManager ) context . getSystemService ( Context . USB_SERVICE ) ;
if ( usbManager = = null )
break ; // ???
if ( usbManager . hasPermission ( usbDevice ) )
isUsbDeviceAccessible = true ;
else {
isUsbDeviceAccessible = false ;
usbManager . requestPermission ( usbDevice , PendingIntent . getBroadcast ( context , 0 , new Intent ( NsConstants . REQUEST_NS_ACCESS_INTENT ) , 0 ) ) ;
}
break ;
case NsConstants . REQUEST_NS_ACCESS_INTENT :
isUsbDeviceAccessible = intent . getBooleanExtra ( UsbManager . EXTRA_PERMISSION_GRANTED , false ) ;
break ;
case UsbManager . ACTION_USB_DEVICE_DETACHED :
usbDevice = null ;
isUsbDeviceAccessible = false ;
2020-03-23 20:33:17 +03:00
stopService ( new Intent ( context , CommunicationsService . class ) ) ;
2019-07-10 04:37:52 +03:00
break ;
case NsConstants . SERVICE_TRANSFER_TASK_FINISHED_INTENT :
ArrayList < NSPElement > nspElements = intent . getParcelableArrayListExtra ( NsConstants . SERVICE_CONTENT_NSP_LIST ) ;
2020-03-23 20:33:17 +03:00
if ( nspElements = = null )
break ;
2019-07-10 04:37:52 +03:00
for ( int i = 0 ; i < mDataset . size ( ) ; i + + ) {
2020-03-23 20:33:17 +03:00
for ( NSPElement receivedNSPe : nspElements )
if ( receivedNSPe . getFilename ( ) . equals ( mDataset . get ( i ) . getFilename ( ) ) )
mDataset . get ( i ) . setStatus ( receivedNSPe . getStatus ( ) ) ;
2019-07-10 04:37:52 +03:00
}
mAdapter . notifyDataSetChanged ( ) ;
blockUI ( false ) ;
break ;
}
}
}
}