Skip to content
Snippets Groups Projects
Commit 796292ff authored by Charlie Darques's avatar Charlie Darques
Browse files

ajout des fichiers

parent 03911ae5
No related branches found
No related tags found
No related merge requests found
Showing
with 624 additions and 0 deletions
XMen @ 2121fa41
Subproject commit 2121fa41fe013b87f360493c861c80b4b987366f
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>
\ No newline at end of file
/build
\ No newline at end of file
plugins {
id 'com.android.application'
}
android {
namespace 'com.example.xmen_tp5_2324'
compileSdk 34
defaultConfig {
applicationId "com.example.xmen_tp5_2324"
minSdk 27
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures{
viewBinding true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildToolsVersion '35.0.0'
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.recyclerview:recyclerview:1.3.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.example.xmen_tp5_2324;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.xmen_tp5_2324", appContext.getPackageName());
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name=".XMenApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.XMen"
tools:targetApi="31">
<activity
android:name=".EditActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
package com.example.xmen_tp5_2324;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import com.example.xmen_tp5_2324.databinding.ActivityEditBinding;
public class EditActivity extends AppCompatActivity {
private List<XMen> liste;
//private EditXmenBinding ui;
private ActivityEditBinding ui;
@Override
protected void onCreate(Bundle savedInstanceState) {
// obtenir la liste
super.onCreate(savedInstanceState);
XMenApplication application = (XMenApplication) getApplication();
liste = application.getListe();
ui = ActivityEditBinding.inflate(getLayoutInflater());
setContentView(ui.getRoot());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_menu, menu);
return super.onCreateOptionsMenu(menu);
}
/**
* créer une nouvelle instance de XMen et la remplir avec les EditText de l'interface
*/
public void onAccept(MenuItem item) {
XMen xmen = new XMen();
xmen.setNom(ui.editNom.getText().toString());
xmen.setAlias(ui.editAlias.getText().toString());
xmen.setPouvoirs(ui.editPouvoirs.getText().toString());
xmen.setDescription(ui.editDesc.getText().toString());
Intent intent = getIntent();
int position = intent.getIntExtra("position",-1);
if (position < 0)
liste.add(xmen);
else {
liste.remove(position);
liste.add(position, xmen);
}
setResult(RESULT_OK);
finish();
}
}
\ No newline at end of file
package com.example.xmen_tp5_2324;
import static com.example.xmen_tp5_2324.databinding.ActivityMainBinding.inflate;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Menu;
import com.example.xmen_tp5_2324.databinding.ActivityMainBinding;
import java.util.*;
public class MainActivity extends AppCompatActivity implements XMenAdapter.OnItemClickListener {
private ActivityMainBinding ui;
private ActivityResultLauncher<Intent> editLauncher;
private List<XMen> liste; // variable membre
private XMenAdapter adapter; // variable membre
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
ui = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(ui.getRoot());
// obtenir la liste
XMenApplication application = (XMenApplication) getApplication();
liste = application.getListe();
// créer l'adaptateur
adapter = new XMenAdapter(liste);
// on fournit l'activité comme écouteur de clics à l'adaptateur (qui le fournira lui-même aux view holders)
adapter.setOnItemClickListener(this);
// fournir l'adaptateur au recycler
ui.recycler.setAdapter(adapter);
ui.recycler.setHasFixedSize(true);
RecyclerView.LayoutManager lm = new LinearLayoutManager(this);
ui.recycler.setLayoutManager(lm);
// création du launcher d'activité d'édition de personnage
editLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
this::onEditActivityFinished);
}
/**
* Cette méthode est appelée quand on revient dans cette activité
* après l'avoir lancée par editLauncher
*/
// @SuppressLint("NotifyDataSetChanged")
@SuppressLint("NonConstantResourceId")
private void onEditActivityFinished(ActivityResult result) {
if (result.getResultCode() == RESULT_OK) {
adapter.notifyDataSetChanged();
}
}
@Override
public void onItemClick(int position) {
// récupérer le X-Men concerné
XMen xmen = liste.get(position);
// changer l'image du X-Men
xmen.setIdImage(R.drawable.undef);
// signaler à l'adaptateur que l'élément a changé
adapter.notifyItemChanged(position);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@SuppressLint("NonConstantResourceId")
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
XMenApplication application = (XMenApplication) getApplication();
switch (item.getItemId()) {
case R.id.reinit:
application.initListe();
adapter.notifyDataSetChanged();
return true;
case R.id.create:
// TODO voir exercice suivant
onEdit(-1);
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* lancer l'édition sur un XMen indiqué par position, -1 si création
* @param position: index dans la liste, mettre -1 si on veut créer un X-Men
*/
private void onEdit(int position) {
// créer un Intent pour lancer EditActivity
Intent intent = new Intent(this,EditActivity.class);
intent.putExtra("position",position);
// démarrer l'activité avec attente du résultat
editLauncher.launch(intent);
}
private void onDelete(int position) {
// créer un Intent pour lancer EditActivity
liste.remove(position);
adapter.notifyDataSetChanged();
}
@Override
public boolean onContextItemSelected(MenuItem item){
// récupérer la position de l'élément concerné par le menu (dans order)
int position = item.getOrder();
// selon le bouton de menu
switch (item.getItemId()) {
case XMenViewHolder.MENU_EDIT:
onEdit(position);
return true;
case XMenViewHolder.MENU_DELETE:
// TODO décommenter quand cette méthode sera ajoutée, voir la fin du sujet
onDelete(position);
return true;
}
return super.onContextItemSelected(item);
}
}
\ No newline at end of file
package com.example.xmen_tp5_2324;
import androidx.annotation.DrawableRes;
public class XMen {
// variables représentant les informations
private String nom;
private String alias;
private String description;
private String pouvoirs;
// TODO ajouter les champs manquants : alias,...
private @DrawableRes int idImage;
// constructeur sans paramètre
public XMen(){
nom = "inconnu";
this.idImage = R.drawable.undef;
}
public XMen(String nom, String alias, String description, String pouvoirs, @DrawableRes int idImage) {
this.nom = nom;
this.alias = alias.equals("") ? "" : "(" + alias + ")";
this.description = description;
this.pouvoirs = pouvoirs;
this.idImage = idImage;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPouvoirs() {
return pouvoirs;
}
public void setPouvoirs(String pouvoirs) {
this.pouvoirs = pouvoirs;
}
public @DrawableRes int getIdImage() {
return idImage;
}
public void setIdImage(@DrawableRes int idImage) {
this.idImage = idImage;
}
}
package com.example.xmen_tp5_2324;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.xmen_tp5_2324.databinding.XMenBinding;
import java.util.List;
public class XMenAdapter extends RecyclerView.Adapter<XMenViewHolder>{
// variable membre du type de l'interface
private XMenAdapter.OnItemClickListener onItemClickListener;
private List<XMen> liste;
private final String TAG = "XMEN";
public XMenAdapter(List liste){
this.liste = liste;
}
@NonNull
@Override
public XMenViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.i(TAG,"onCreateViewHolder");
XMenBinding ui = XMenBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,
false);
return new XMenViewHolder(ui);
}
@Override
public void onBindViewHolder(@NonNull XMenViewHolder holder, int position) {
Log.i(TAG,"onBindViewHolder: " + position);
holder.setXMen(liste.get(position));
holder.setOnItemClickListener(onItemClickListener); // écouteur transmis au viewholder
}
@Override
public int getItemCount() {
return this.liste.size();
}
// interface publique d'écouteur
public interface OnItemClickListener {
void onItemClick(int position);
}
// setter
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
package com.example.xmen_tp5_2324;
import android.app.Application;
import android.content.res.Resources;
import android.content.res.TypedArray;
import java.util.*;
public class XMenApplication extends Application {
// variable globale de l'application : la liste des XMen
private final List<XMen> liste = new ArrayList<XMen>();
// initialisation du contexte
@Override public void onCreate() {
super.onCreate();
initListe();
}
public List<XMen> getListe() {
return liste;
}
public void initListe(){
// /!\ il faut préalablement vider la liste
liste.clear();
// accès aux ressources
Resources res = getResources();
final String[] noms = res.getStringArray(R.array.noms);
final String[] alias = res.getStringArray(R.array.alias);
final String[] descriptions = res.getStringArray(R.array.descriptions);
final String[] pouvoirs = res.getStringArray(R.array.pouvoirs);
TypedArray images = res.obtainTypedArray(R.array.idimages);
// recopier les données dans la liste
for (int i=0; i<noms.length; ++i) {
XMen xm = new XMen(noms[i], alias[i], descriptions[i], pouvoirs[i], images.getResourceId(i, 0));
liste.add(xm);
}
// libérer certaines ressources explicitement
images.recycle();
}
}
package com.example.xmen_tp5_2324;
import android.view.View;
import android.view.ContextMenu;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.xmen_tp5_2324.databinding.XMenBinding;
public class XMenViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public static final int MENU_EDIT = 1;
public static final int MENU_DELETE = 2;
// même variable membre que dans l'adaptateur
private XMenAdapter.OnItemClickListener onItemClickListener;
private final XMenBinding ui;
public XMenViewHolder(@NonNull XMenBinding ui)
{
super(ui.getRoot());
this.ui = ui;
// on associe cette classe comme écouteur de clic de l'item entier
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this::onCreateContextMenu);
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
// position du X-Men concerné
int position = getAdapterPosition();
// titre du menu = nom du X-Men
menu.setHeaderTitle(ui.nom.getText());
// utiliser order (3e param) pour stocker la position du X-Men
menu.add(0, MENU_EDIT, position, "Edit");
menu.add(0, MENU_DELETE, position, "Delete");
}
public void setXMen(XMen xmen) {
ui.nom.setText(xmen.getNom());
ui.alias.setText(xmen.getAlias());
ui.pouvoirs.setText(xmen.getPouvoirs());
ui.description.setText(xmen.getDescription());
ui.image.setImageResource(xmen.getIdImage());
}
public void onClick(View v) {
if (onItemClickListener != null) // test par précaution
onItemClickListener.onItemClick(getAbsoluteAdapterPosition());
}
// même setter que dans l'adaptateur
public void setOnItemClickListener(XMenAdapter.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
Xmen_tp5_2324/app/src/main/res/drawable-hdpi/ic_action_accept.png

420 B

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment