-
-
Save JavaDeveloper/3122179 to your computer and use it in GitHub Desktop.
package com.android.filechooser.example; | |
import android.app.Activity; | |
import android.content.Intent; | |
import android.os.Bundle; | |
import android.util.Log; | |
import com.iusenko.filechooser.FileChooserActivity; | |
public class MainActivity extends Activity { | |
private static final String TAG = MainActivity.class.getSimpleName(); | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
startActivityForResult(new Intent(this, FileChooserActivity.class), FileChooserActivity.PICK_UP_FILE_REQUEST); | |
} | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
Log.d(TAG, "onActivityResult(" + requestCode + ", " + resultCode + ",...)"); | |
if (FileChooserActivity.FILE_SELECTED_RESULT != resultCode) { | |
return; | |
} | |
String path = data.getStringExtra(FileChooserActivity.SELECTED_FILE_KEY); | |
Log.d(TAG, "Selected file: " + path); | |
super.onActivityResult(requestCode, resultCode, data); | |
} | |
} |
Thor1440
commented
Mar 12, 2022
Android
import { useState } from 'react'
import { Button } from "/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "/components/ui/card"
import { Input } from "/components/ui/input"
import { Label } from "/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Plus, Trash2, Upload, X, Eye } from 'lucide-react'
interface Coin {
id: string
code: string
name: string
country: string
year: number
continent: string
metal: string
value: number
observations: string
obverseImage?: string
reverseImage?: string
flagImage?: string
}
const continents = [
'Africa',
'Asia',
'Europe',
'North America',
'South America',
'Oceania',
'Antarctica'
]
const metals = [
'Gold',
'Silver',
'Copper',
'Bronze',
'Nickel',
'Aluminum',
'Zinc',
'Steel',
'Bi-metal',
'Other'
]
export default function CoinArchiver() {
const [coins, setCoins] = useState<Coin[]>([])
const [formData, setFormData] = useState({
code: '',
name: '',
country: '',
year: new Date().getFullYear(),
continent: '',
metal: '',
value: 0,
observations: ''
})
const [images, setImages] = useState({
obverse: '',
reverse: '',
flag: ''
})
const [selectedCoin, setSelectedCoin] = useState<Coin | null>(null)
const handleInputChange = (field: string, value: string | number) => {
setFormData(prev => ({ ...prev, [field]: value }))
}
const handleImageUpload = (type: 'obverse' | 'reverse' | 'flag', file: File) => {
const reader = new FileReader()
reader.onload = (e) => {
setImages(prev => ({ ...prev, [type]: e.target?.result as string }))
}
reader.readAsDataURL(file)
}
const addCoin = () => {
if (!formData.code || !formData.name || !formData.country || !formData.continent || !formData.metal) {
alert('Please fill in all required fields')
return
}
const newCoin: Coin = {
id: Date.now().toString(),
...formData,
obverseImage: images.obverse,
reverseImage: images.reverse,
flagImage: images.flag
}
setCoins(prev => [...prev, newCoin])
// Reset form
setFormData({
code: '',
name: '',
country: '',
year: new Date().getFullYear(),
continent: '',
metal: '',
value: 0,
observations: ''
})
setImages({ obverse: '', reverse: '', flag: '' })
}
const removeCoin = (id: string) => {
setCoins(prev => prev.filter(coin => coin.id !== id))
if (selectedCoin?.id === id) {
setSelectedCoin(null)
}
}
const totalCoins = coins.length
const totalValue = coins.reduce((sum, coin) => sum + coin.value, 0)
return (
Coin Archiver
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
{/* Coin Entry Form */}
<Card className="lg:col-span-2">
<CardHeader>
<CardTitle>Add New Coin</CardTitle>
<CardDescription>Enter the details of your coin below</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<Label htmlFor="code">Code *</Label>
<Input
id="code"
value={formData.code}
onChange={(e) => handleInputChange('code', e.target.value)}
placeholder="e.g., USD-2024"
/>
</div>
<div>
<Label htmlFor="name">Name *</Label>
<Input
id="name"
value={formData.name}
onChange={(e) => handleInputChange('name', e.target.value)}
placeholder="e.g., Lincoln Cent"
/>
</div>
<div>
<Label htmlFor="country">Country *</Label>
<Input
id="country"
value={formData.country}
onChange={(e) => handleInputChange('country', e.target.value)}
placeholder="e.g., United States"
/>
</div>
<div>
<Label htmlFor="year">Year</Label>
<Input
id="year"
type="number"
value={formData.year}
onChange={(e) => handleInputChange('year', parseInt(e.target.value))}
/>
</div>
<div>
<Label htmlFor="continent">Continent *</Label>
<Select value={formData.continent} onValueChange={(value) => handleInputChange('continent', value)}>
<SelectTrigger>
<SelectValue placeholder="Select continent" />
</SelectTrigger>
<SelectContent>
{continents.map(continent => (
<SelectItem key={continent} value={continent}>{continent}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div>
<Label htmlFor="metal">Metal *</Label>
<Select value={formData.metal} onValueChange={(value) => handleInputChange('metal', value)}>
<SelectTrigger>
<SelectValue placeholder="Select metal" />
</SelectTrigger>
<SelectContent>
{metals.map(metal => (
<SelectItem key={metal} value={metal}>{metal}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div>
<Label htmlFor="value">Value ($)</Label>
<Input
id="value"
type="number"
step="0.01"
value={formData.value}
onChange={(e) => handleInputChange('value', parseFloat(e.target.value))}
/>
</div>
</div>
<div>
<Label htmlFor="observations">Observations</Label>
<Textarea
id="observations"
value={formData.observations}
onChange={(e) => handleInputChange('observations', e.target.value)}
placeholder="Any special notes about this coin..."
rows={3}
/>
</div>
{/* Image Uploads */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
{(['obverse', 'reverse', 'flag'] as const).map(type => (
<div key={type} className="space-y-2">
<Label className="capitalize">{type} Image</Label>
<div className="border-2 border-dashed border-gray-300 rounded-lg p-4">
{images[type] ? (
<div className="relative">
<img src={images[type]} alt={type} className="w-full h-32 object-cover rounded" />
<Button
size="sm"
variant="destructive"
className="absolute top-1 right-1"
onClick={() => setImages(prev => ({ ...prev, [type]: '' }))}
>
<X className="h-4 w-4" />
</Button>
</div>
) : (
<label className="cursor-pointer flex flex-col items-center">
<Upload className="h-8 w-8 text-gray-400 mb-2" />
<span className="text-sm text-gray-500">Upload {type}</span>
<input
type="file"
accept="image/*"
className="hidden"
onChange={(e) => e.target.files?.[0] && handleImageUpload(type, e.target.files[0])}
/>
</label>
)}
</div>
</div>
))}
</div>
<Button onClick={addCoin} className="w-full">
<Plus className="mr-2 h-4 w-4" />
Add Coin
</Button>
</CardContent>
</Card>
{/* Summary Display */}
<div className="space-y-6">
<Card>
<CardHeader>
<CardTitle>Collection Summary</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex justify-between items-center">
<span className="text-muted-foreground">Total Coins:</span>
<span className="text-2xl font-bold">{totalCoins}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-muted-foreground">Total Value:</span>
<span className="text-2xl font-bold">${totalValue.toFixed(2)}</span>
</div>
</CardContent>
</Card>
{/* Recent Coins */}
<Card>
<CardHeader>
<CardTitle>Recent Coins</CardTitle>
</CardHeader>
<CardContent>
<div className="space-y-3 max-h-96 overflow-y-auto">
{coins.length === 0 ? (
<p className="text-muted-foreground text-center py-8">No coins added yet</p>
) : (
coins.slice(-5).reverse().map(coin => (
<div key={coin.id} className="flex items-center justify-between p-3 bg-gray-50 rounded-lg">
<div>
<p className="font-medium">{coin.name}</p>
<p className="text-sm text-muted-foreground">{coin.country} - {coin.year}</p>
</div>
<div className="flex items-center gap-2">
<Button
size="sm"
variant="ghost"
onClick={() => setSelectedCoin(coin)}
>
<Eye className="h-4 w-4" />
</Button>
<span className="text-sm font-medium">${coin.value.toFixed(2)}</span>
<Button
size="sm"
variant="ghost"
onClick={() => removeCoin(coin.id)}
>
<Trash2 className="h-4 w-4" />
</Button>
</div>
</div>
))
)}
</div>
</CardContent>
</Card>
</div>
</div>
{/* Full Coin List */}
{coins.length > 0 && (
<Card className="mt-6">
<CardHeader>
<CardTitle>All Coins</CardTitle>
</CardHeader>
<CardContent>
<div className="overflow-x-auto">
<table className="w-full">
<thead>
<tr className="border-b">
<th className="text-left py-2">Code</th>
<th className="text-left py-2">Name</th>
<th className="text-left py-2">Country</th>
<th className="text-left py-2">Year</th>
<th className="text-left py-2">Continent</th>
<th className="text-left py-2">Metal</th>
<th className="text-right py-2">Value ($)</th>
<th className="text-center py-2">Images</th>
<th className="text-center py-2">Actions</th>
</tr>
</thead>
<tbody>
{coins.map(coin => (
<tr key={coin.id} className="border-b">
<td className="py-2">{coin.code}</td>
<td className="py-2">{coin.name}</td>
<td className="py-2">{coin.country}</td>
<td className="py-2">{coin.year}</td>
<td className="py-2">{coin.continent}</td>
<td className="py-2">{coin.metal}</td>
<td className="py-2 text-right">${coin.value.toFixed(2)}</td>
<td className="py-2 text-center">
<div className="flex justify-center gap-1">
{coin.obverseImage && <div className="w-2 h-2 bg-blue-500 rounded-full" title="Obverse" />}
{coin.reverseImage && <div className="w-2 h-2 bg-green-500 rounded-full" title="Reverse" />}
{coin.flagImage && <div className="w-2 h-2 bg-red-500 rounded-full" title="Flag" />}
</div>
</td>
<td className="py-2 text-center">
<Button
size="sm"
variant="ghost"
onClick={() => setSelectedCoin(coin)}
>
<Eye className="h-4 w-4" />
</Button>
<Button
size="sm"
variant="ghost"
onClick={() => removeCoin(coin.id)}
>
<Trash2 className="h-4 w-4" />
</Button>
</td>
</tr>
))}
</tbody>
</table>
</div>
</CardContent>
</Card>
)}
{/* Coin Details Modal */}
{selectedCoin && (
<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
<Card className="max-w-4xl w-full max-h-[90vh] overflow-y-auto">
<CardHeader>
<div className="flex justify-between items-start">
<div>
<CardTitle>{selectedCoin.name}</CardTitle>
<CardDescription>
{selectedCoin.country} - {selectedCoin.year} - {selectedCoin.continent}
</CardDescription>
</div>
<Button
size="sm"
variant="ghost"
onClick={() => setSelectedCoin(null)}
>
<X className="h-4 w-4" />
</Button>
</div>
</CardHeader>
<CardContent className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<Label>Code:</Label>
<p>{selectedCoin.code}</p>
</div>
<div>
<Label>Metal:</Label>
<p>{selectedCoin.metal}</p>
</div>
<div>
<Label>Value:</Label>
<p>${selectedCoin.value.toFixed(2)}</p>
</div>
<div>
<Label>Observations:</Label>
<p className="whitespace-pre-wrap">{selectedCoin.observations || 'No observations'}</p>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
{selectedCoin.obverseImage && (
<div>
<Label>Obverse</Label>
<img src={selectedCoin.obverseImage} alt="Obverse" className="w-full h-48 object-cover rounded" />
</div>
)}
{selectedCoin.reverseImage && (
<div>
<Label>Reverse</Label>
<img src={selectedCoin.reverseImage} alt="Reverse" className="w-full h-48 object-cover rounded" />
</div>
)}
{selectedCoin.flagImage && (
<div>
<Label>Flag</Label>
<img src={selectedCoin.flagImage} alt="Flag" className="w-full h-48 object-cover rounded" />
</div>
)}
</div>
</CardContent>
</Card>
</div>
)}
</div>
</div>
)
}
Share
Refresh