Skip to content

Instantly share code, notes, and snippets.

View gavingt's full-sized avatar

Gavin Wright gavingt

  • Simplified IT Products
  • Arizona
View GitHub Profile
// Returns true if the given StorageVolume is an SD card.
// This reads the proc/mounts file, which contains mount info for all drives on device.
// A USB drive will show on a line like: /dev/block/vold/public:8,1 on /mnt/media_rw/68C9-D020 type vfat (rw,dirsync,nosuid,nodev,noexec,noatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
// An SD card will show on a line like: /dev/block/vold/public:179,65 on /mnt/media_rw/084E-056D type vfat (rw,dirsync,nosuid,nodev,noexec,noatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
// The /dev/block/vold/public:8 indicates a USB drive at 68C9-D020, while /dev/block/vold/public:179 indicates an SD card at 084E-056D.
@RequiresApi(ANDROID_7_SDK_24)
fun isStorageVolumeAnSdCard(storageVolume: StorageVolume): Boolean {
if (storageVolume.uuid == null) return false
var bufferedReader: BufferedReader?
// Returns true if this UsbDevice has the necessary interface and endpoints to qualify as a UsbMassStorageDevice.
fun UsbDevice.isUsbMassStorageDevice(): Boolean {
(0 until this.interfaceCount).map { getInterface(it) }
.filter { it.interfaceClass == UsbConstants.USB_CLASS_MASS_STORAGE }
.map { usbInterface ->
logMessage("Tools", "Found usb interface: $usbInterface")
// Every mass storage device has exactly two endpoints
// One IN and one OUT endpoint
val endpointCount = usbInterface.endpointCount
// Detects if user granted permissions to USB drive root, rather than accidentally granting it to some other folder.
private fun driveHasRootPermission(uri: Uri): Boolean {
val documentFileFromUri = DocumentFile.fromTreeUri(appContext, uri)
val nameFromUri = documentFileFromUri?.name ?: ""
if (Build.VERSION.SDK_INT >= ANDROID_11_SDK_30) {
val recentExternalVolumeNames = getRecentExternalVolumeNames(appContext).map { it.lowercase() }
// Checks whether the user-selected Uri points to a writable location and its name matches that of a recently used external volume.
if (documentFileFromUri?.canWrite() == true && recentExternalVolumeNames.contains(nameFromUri.lowercase())) return true
static void unzip(InputStream uriInputStream, String unzipDirectory) throws Exception {
//create target location folder if not exist
createDirIfNotExist(unzipDirectory);
ZipInputStream zipInputStream = new ZipInputStream(uriInputStream);
ZipEntry ze;
while ((ze = zipInputStream.getNextEntry()) != null) {
//create dir if required while unzipping
if (ze.isDirectory()) {
createDirIfNotExist(ze.getName());
package com.gavinsappcreations.upcominggames.ui.list
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.gavinsappcreations.upcominggames.R
view.viewTreeObserver.addOnGlobalLayoutListener {
autocompleteFragment.view?.viewTreeObserver?.addOnGlobalLayoutListener {
val clearButton =
autocompleteFragment.view!!.findViewById<ImageButton>(R.id.places_autocomplete_clear_button)
//If user presses autocompleteFragment's clearButton, set place = null
clearButton.setOnClickListener {
sharedViewModel.onPlaceChanged(null)
}
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new Filter.FilterResults();
if (constraint != null && constraint.length() > 1) {
String inputText = editText.getText().toString().toLowerCase().trim();
List<Address> tempAddressList = new ArrayList<>();
package appinventor.ai_GavinGT.DeliveryTipTrackerPro_ready_for_market.custom_classes;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
package appinventor.ai_GavinGT.DeliveryTipTrackerPro_ready_for_market.custom_classes;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
package appinventor.ai_GavinGT.DeliveryTipTrackerPro_ready_for_market.custom_classes;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;